c# - GetAwaiter()。GetResult()和.Result都不对我有用,但是Task.Run(await()=> nameOfMethodTobeCalled())。Result可以工作。我听不懂

标签 c# multithreading dll async-await task-parallel-library

在我的asp.net应用程序中,我正在调用我添加到应用程序中的nuget包中的一种异步方法。现在,我有了一个同步方法,在该方法中,我需要调用添加的.dll的异步方法。因此,为此我调用了这些方法并检索了我使用的结果
var value = myDllClient.MyMethod()。GetAwaiter()。GetResult();和
var value = myDllClient.MyMethod()。Result ;,
但是这些都不对我有用,但是线程进入了永无止境的过程。我什么也没收到
所以我用
var value = Task.Run(async()=>等待myDllClient.MyMethod())。Result;令人惊讶地工作正常。
我不知道它是如何运作的?
谁能帮助我了解这个谜?提前致谢

最佳答案

So for that I called those method and to retrieve result I used



更好的解决方案是使用awaitallow the asynchrony to grow naturally through the code base。如果您执行,则让执行异步同步,然后direct blocking like that may cause deadlocks

await captures a context by default,在您的情况下await内部的MyMethod捕获的是ASP.NET request context,它存在于ASP.NET的pre-Core版本中。然后,调用代码通过调用GetResult()/Result阻止该请求上下文中的线程。稍后,当await准备好继续时,它将MyMethod的其余部分调度到该上下文。但是它永远不会运行,因为在该上下文中有一个线程被阻塞,等待MyMethod完成。
Task.Run不会死锁的原因是因为MyMethod使用线程池上下文而不是ASP.NET请求上下文。这是"thread pool hack"进行异步同步的方法。但是, Task.Run is not recommended on ASP.NET;如果可能,请将代码更改为改为使用await

关于c# - GetAwaiter()。GetResult()和.Result都不对我有用,但是Task.Run(await()=> nameOfMethodTobeCalled())。Result可以工作。我听不懂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59885432/

相关文章:

c# - 在 C# 和 C 之间传递对象

c# - ExecuteReader 仅返回 1 个值

c# - 没有 'using someNamespace' 的 var 关键字

c# - 有没有办法单独设置 Winforms ListView 单元格的 BackColor?

c# - 使用 Task.Factory.StartNew 和 Thread.Sleep 等待 x 秒

c++ - 静态初始化时能否安全创建线程?

c# - 如何在 C# 中获取内存 MS Windows 7 的当前页面大小?

iphone - 塔防游戏中的多线程寻路

delphi - 使用 dll 的接口(interface)安全吗

c++ - 如何正确处置注入(inject)的DLL线程?