在我的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
更好的解决方案是使用
await
和allow 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/