GetAwaiter().GetResult() 和 .Result 都不适合我,但 Task.Run(await ()=> nameOfMethodTobeCalled()).Result 工作。我没听懂?

Muk*_*med 4 c# dll multithreading task-parallel-library async-await

在我的 asp.net 应用程序中,我正在调用我添加到应用程序中的 nuget 包的一些异步方法。现在我有一个同步方法,我需要调用我添加的 .dll 的异步方法。因此,我调用了这些方法并检索结果,我使用了

var value = myDllClient.MyMethod().GetAwaiter().GetResult(); 和
var value = myDllClient.MyMethod().Result;,

但这些都不适合我,但线程进入永无止境的过程。我从未收到过任何东西所以我使用了

var value = Task.Run(async ()=> wait myDllClient.MyMethod()).Result;

令人惊讶的是工作正常。我不知道它的运作如何?谁能帮我解开这个谜团?

提前致谢

Ste*_*ary 9

因此,我调用了这些方法并检索我使用的结果

更好的解决方案是使用异步await允许异步通过代码库自然增长。如果您确实必须进行异步同步,那么像这样的直接阻塞可能会导致死锁

await默认情况下捕获上下文,在您的情况下,await内部MyMethod正在捕获ASP.NET 请求上下文,该上下文存在于ASP.NET Core 之前的版本中。GetResult()然后,调用代码通过调用/来阻塞该请求上下文中的线程Result。稍后,当await准备好继续时,它将剩余的内容安排MyMethod到该上下文。但它永远不会运行,因为该上下文中有一个线程被阻塞等待MyMethod完成。

Task.Run没有死锁的原因是因为MyMethod使用线程池上下文而不是 ASP.NET 请求上下文。这是执行异步同步的“线程池黑客”方法。但是,Task.Run不建议在 ASP.NET 上使用;如果可能,请更改要使用的代码await