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