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

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