gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:16:49 26 4
gpt4 key购买 nike

在我的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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com