RunContinuationsAsynchronously 不会以异步方式运行延续

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 3118695
症状
.NET Framework 4.6 添加新的枚举类型值, RunContinuationsAsynchronouslyTaskCompletionSourceTaskCreationOptions枚举。该值将强制任务异步运行,这有助于避免死锁情况。然而,一个问题已经被发现,对于延续 (Task.WhenAllTask.WhenAnyTaskExtensions.Unwrap在创建延续任务时尤其) 是在某些特定类型,将忽略此选项。因此,延续可能仍以同步方式运行。

下面的示例显示了此问题。如果RunContinuationsAsynchronously的值正常的两个线程打印出来的 Id 将永远不会变,因为总是会到不同的线程上安排延续。

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();    }}

解决方案
目前尚无解决此问题的方法。Microsoft.NET Framework 中工作组在将来的更新中包括的解决方案。


警告:本文已自动翻译

属性

文章 ID:3118695 - 上次审阅时间:11/25/2015 05:47:00 - 修订版本: 1.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbexpertiseadvanced kbtshoot kbmt KB3118695 KbMtzh
反馈