Версия 1.4 от Alexandr Fokin на 2023/01/11 14:48

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