c# – 即使在Asp.Net流中使用ConfigureAwait(false)后仍然死锁

c# – 即使在Asp.Net流中使用ConfigureAwait(false)后仍然死锁,第1张

概述即使在使用ConfigureAwait(false)之后,我也遇到死锁,下面是示例代码. 根据样本http://blog.stephencleary.com/2012/02/async-and-await.html(#Avoding上下文),这不应该是死锁. 这是我的课: public class ProjectsRetriever{ public string GetProjects( 即使在使用ConfigureAwait(false)之后,我也遇到死锁,下面是示例代码.

根据样本http://blog.stephencleary.com/2012/02/async-and-await.html(#Avoding上下文),这不应该是死锁.

这是我的课:

public class ProjectsRetrIEver{    public string GetProjects()    {        ...        var projects = this.GetProjects(uri).Result;        ...        ...    }    private async Task<IEnumerable<Project>> GetProjects(Uri uri)    {        return await this.projectSystem.GetProjects(uri,Constants.Username).ConfigureAwait(false);    }}

这个类来自一个共享库:

public class ProjectSystem{    public async Task<IEnumerable<Project>> GetProjects(Uri uri,string username)    {        var projectClIEnt = this.GethttpClIEnt<ProjecthttpClIEnt>(uri);        var projects = await projectClIEnt.GetProjects();        // code here is never hit        ...}

如果我在配置httpClIEnt调用的共享库中添加ConfigureAwait(false)来等待调用,则可以工作:

public class ProjectSystem{    public async Task<IEnumerable<Project>> GetProjects(Uri uri,string username)    {        var projectClIEnt = this.GethttpClIEnt<ProjecthttpClIEnt>(uri);        var projects = await projectClIEnt.GetProjects().ConfigureAwait(false);        // no deadlock,resumes in a new thread.        ...}

我一直在浏览所有发现的博客,只有区别我发现ConfigureAwait(false)工作时使用httpClIEnt.AsyncAPI()调用!

请帮忙澄清!!!

解决方法 从评论:

I was under assumption,once ConfigureAwait(false) is used (any where in the call stack),execution from that point will not cause deadlock.

我不相信黑魔法,也不应该.始终努力了解当您在代码中使用某些内容时会发生什么.

当等待返回任务或任务< T>的异步方法时,Task.GetAwaiter方法生成的TaskAwaitable将隐含捕获SynchronizationContext.

一旦同步上下文到位并且异步方法调用完成,TaskAwaitable会尝试将继承(其基本上是第一个await关键字之后的其余方法调用)编组到先前捕获的SynchronizationContext(使用SynchronizationContext.Post) .如果调用线程被阻止,等待同一个方法完成,你有一个死锁.

你应该问自己Should I expose synchronous wrappers for asynchronous methods? 99%的答案是否定的.您应该使用同步API,例如WebClIEnt提供的API.

总结

以上是内存溢出为你收集整理的c# – 即使在Asp.Net流中使用ConfigureAwait(false)后仍然死锁全部内容,希望文章能够帮你解决c# – 即使在Asp.Net流中使用ConfigureAwait(false)后仍然死锁所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1260295.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存