Версия 4.1 от Alexandr Fokin на 2023/01/11 15:18

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