Симптомы

4.6 платформа.NET Framework добавлено новое значение типа enum, RunContinuationsAsynchronouslyдля перечисления TaskCreationOptions и TaskCompletionSource . Этот режим позволяет асинхронно выполнять задачи, и это позволяет избежать подобных ситуаций. Тем не менее, была обнаружена проблема, для некоторых конкретных видов продолжений (в частности, при Task.WhenAll, Task.WhenAnyили TaskExtensions.Unwrap создайте продолжения) параметр обрабатывается. Таким образом продолжение может выполняться синхронно.Следующий пример показывает проблемы. Значение RunContinuationsAsynchronously работают должным образом, идентификаторы, которые будут выведены два потока никогда не будет такой же, так как продолжение всегда будет планироваться на различных потоках.using System;using System.Threading;using System.Threading.Tasks;class Program{ static void Main() { var mres = new ManualResetEventSlim(); Console.WriteLine(Environment.CurrentManagedThreadId); var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously); var t = Task.WhenAll(tcs.Task); t.ContinueWith(delegate { Console.WriteLine(Environment.CurrentManagedThreadId); mres.Set(); }, TaskContinuationOptions.ExecuteSynchronously); tcs.SetResult(true); mres.Wait(); }}

Решение

В данный момент нет решения этой проблемы. Платформа.NET Framework Microsoft team работает над решением для включения в будущие обновления.

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.