Исходный код вики Имитация Async Deadlock
Версия 1.1 от Alexandr Fokin на 2023/01/11 14:34
Скрыть последних авторов
author | version | line-number | content |
---|---|---|---|
![]() |
1.1 | 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}} |