Версия 5.4 от Alexandr Fokin на 2024/03/23 16:49

Скрыть последних авторов
Alexandr Fokin 5.4 1 | |
2 | |(((
Alexandr Fokin 4.1 3 [[Асинхронность. Async Await>>doc:Разработка.NET.C#.Многопоточность и асинхронность.Асинхронность\. Async Await.WebHome]]
Alexandr Fokin 1.5 4
Alexandr Fokin 5.4 5 [[TaskFactory>>doc:Разработка.NET.C#.Многопоточность и асинхронность.TaskFactory.WebHome]]
6
Alexandr Fokin 5.1 7 [[Проблемы>>doc:Разработка.NET.C#.Многопоточность и асинхронность.Асинхронность\. Async Await.Проблемы.WebHome]]
Alexandr Fokin 5.4 8 )))
9 | |
Alexandr Fokin 1.2 10
11 ----
12
13
Alexandr Fokin 1.1 14 {{code language="C#"}}
15 [TestMethod]
16 public async Task AsyncDeadlockTest1Async()
17 {
18 var delay = TimeSpan.FromMilliseconds(100);
19 var delay2 = TimeSpan.FromMilliseconds(500);
20
21 async Task TestMethodAsync()
22 {
23 await Task.Delay(delay);
24 }
25
26 ConcurrentExclusiveSchedulerPair scheduler = new ConcurrentExclusiveSchedulerPair();
27 TaskFactory factory = new TaskFactory(scheduler: scheduler.ExclusiveScheduler);
28
29 CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
30 AsyncAutoResetEvent startLock = new AsyncAutoResetEvent(set: false);
31
32 var task = factory.StartNew(
33 () =>
34 {
35 startLock.Set();
36
37 var testTask = TestMethodAsync();
38
39 //Deadlock
40 testTask.Wait(
41 cancellationTokenSource.Token
42 );
43 NotCorrectActionError.Throw("Данный код нет должен выплняться из-за Deadlock");
44
45 //Аналогичено, но без токена
46 //testTask
47 // .GetAwaiter()
48 // .GetResult();
49 //NotCorrectActionError.Throw("Данный код нет должен выплняться из-за Deadlock");
50 }
51 );
52
53 await startLock.WaitAsync();
54 cancellationTokenSource.CancelAfter(delay2);
55
56 await Assert.ThrowsExceptionAsync<OperationCanceledException>(
57 async () => await task
58 );
59 }
60 {{/code}}