你的位置:首页 > 软件开发 > ASP.net > C#~异步编程再续~await与async引起的w3wp.exe崩溃-问题友好的解决

C#~异步编程再续~await与async引起的w3wp.exe崩溃-问题友好的解决

发布时间:2016-05-11 15:00:23
关于死锁的原因理解该死锁的原因在于理解await 处理contexts的方式,默认的,当一个未完成的Task 被await的时候,当前的上下文将在该Task完成的时候重新获得并继续执行剩余的代码。这个context就是当前的SynchronizationContext ,除非它是 ...

关于死锁的原因

理解该死锁的原因在于理解await 处理contexts的方式,默认的,当一个未完成的Task 被await的时候,当前的上下文将在该Task完成的时候重新获得并继续执行剩余的代码。这个context就是当前的SynchronizationContext ,除非它是空的。WEB应用程序的SynchronizationContext 有排他性,只允许一个get='_blank'>线程运行。当await 完成的时候,它试图在它原来的代码上下文执行它剩余的部分,但是该代码上下文中已经有一个线程在了,就是那个一直在同步等待async 完成的那个线程,它们两个相互等待,因此就死锁了。

MSDN使用异步应该注意

规则
描述
例外
避免使用 async void
优先使用 async Task 而不用 async void
Event handlers
Async到顶
不要混合使用 blocking 和 async 的代码
Console main method
注意配置好执行的context
尽量设置 ConfigureAwait(false)
需要context的除外

 

感恩的心

多谢网上很多文章的分享,在相关文章中找到了在同步代码中使用异步代码的无阻塞方案,之前也自己写了几个测试的DEMO,但Task<T>这种带有返回值的异步方法还是会出现死锁,之前代码如下:

  /// <summary>  /// 大叔测试  /// </summary>  public class tools  {    #region 假设这些方法被第三方被封装的,不可修改的方法    public static async Task TestAsync()    {      await Task.Delay(1000)           .ConfigureAwait(false);//不会死锁    }    public static async Task<string> GetStrAsync()    {      return await Task.Run(() => "OK").ConfigureAwait(false);    }    public static async Task DelayTestAsync()    {      Logger.LoggerFactory.Instance.Logger_Info("DelayAsync");      await Task.Delay(1000);    }    public static async Task<string> DelayGetStrAsync()    {      return await Task.Run(() => "OK");    }    #endregion    #region 我们需要在自己代码中封装它,解决线程死锁    /// <summary>    /// 没有返回值的同步调用异步的实体    /// </summary>    /// <param name="func"></param>    public static void ForWait(Func<Task> func)    {      func().ConfigureAwait(false);    }    /// <summary>    /// 存在返回值的同步调用异步的实体    /// </summary>    /// <typeparam name="T"></typeparam>    /// <param name="func"></param>    /// <returns></returns>    public static T ForResult<T>(Func<Task<T>> func)    {      var a = func();      a.ConfigureAwait(false);      return a.Result;    }    #endregion  }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:C#~异步编程再续~await与async引起的w3wp.exe崩溃-问题友好的解决

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录