Исходный код вики Имитация асинхронного (Async) Deadlock
Версия 6.4 от Alexandr Fokin на 2024/03/23 16:54
Скрыть последних авторов
author | version | line-number | content |
---|---|---|---|
![]() |
5.4 | 1 | | | |
![]() |
6.4 | 2 | | |[[Асинхронность. Async Await>>doc:Разработка.NET.C#.Многопоточность и асинхронность.Асинхронность\. Async Await.WebHome]] |
![]() |
5.1 | 3 | [[Проблемы>>doc:Разработка.NET.C#.Многопоточность и асинхронность.Асинхронность\. Async Await.Проблемы.WebHome]] |
![]() |
6.4 | 4 | | |[[Task Factory>>doc:Разработка.NET.C#.Многопоточность и асинхронность.Task Factory.WebHome]] |
![]() |
5.5 | 5 | | |{{code language="C#"}}[TestMethod] |
![]() |
1.1 | 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 | ); | ||
![]() |
5.5 | 49 | }{{/code}} |