Исходный код вики Имитация асинхронного (Async) Deadlock
Версия 2.1 от Alexandr Fokin на 2023/01/11 15:17
Последние авторы
author | version | line-number | content |
---|---|---|---|
1 | [[Асинхронность. Async Await>>doc:Разработка.NET.C#.Многопоточность и асинхронность2.Асинхронность\. Async Await.WebHome]] | ||
2 | |||
3 | [[Проблемы>>doc:Разработка.NET.C#.Многопоточность.Асинхронность\. 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}} |