RunContinuationsAsynchronously не асинхронно выполнить продолжений

ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.

Эта статья на английском языке: 3118695
Проблема
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 работает над решением для включения в будущие обновления.


Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 3118695 — последний просмотр: 11/25/2015 05:44:00 — редакция: 1.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbexpertiseadvanced kbtshoot kbmt KB3118695 KbMtru
Отзывы и предложения