Исходный код вики Имитация Async Deadlock

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

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