gpt4 book ai didi

c# - 等待任务完成后不返回

转载 作者:太空狗 更新时间:2023-10-29 17:51:41 24 4
gpt4 key购买 nike

我遇到了任务正在完成但没有返回的问题。我在不同的服务器上有一个网站和一个网络服务。该网站调用 Web 服务,该服务使用具有函数 myFunction() 的库。如果我从 Web 服务服务器上的控制台应用程序调用 myFunction,它将按预期返回。但是,当我从网站调用 web 服务来调用 myFunction() 时,它将进入“第 3 步”,而不是“第 4 步”。我有以下调用的简化版本。

private string myFunction()
{
string myStr = myDoWork().GetAwaiter().GetResult();

return myStr;
}

private async Task<string> myDoWork()
{
logger.Debug("Step 1");
string answer = await aFunction();

logger.Debug("Step 4");

return answer;
}

public async Task<string> aFunction()
{
logger.Debug("Step 2");
return await bFunction(CancellationToken.None);
}

AsyncLock myLock = new AsyncLock();
public Task<string> bFunction(CancellationToken cToken)
{
return Task.Run(
async () =>
{
using (await myLock(cToken))
{
logger.Debug("Step 3");
result = "Hello";
return result;
}
},
cToken);
}

我是异步和等待的新手,所以任何帮助将不胜感激。

最佳答案

这几乎可以肯定是 myFunction() 中的死锁。第 4 步计划在主线程上执行,但它不能执行,因为主线程被阻止等待 GetResult()

它应该更接近于此:

private string myFunction()
{
// This is NOT good style - you should avoid blocking on the result of a task.
string myStr = Task.Run(async () => await myDoWork()).GetAwaiter().GetResult();
return myStr;
}

private async Task<string> myDoWork()
{
logger.Debug("Step 1");
string answer = await aFunction();
logger.Debug("Step 4");
return answer;
}

public Task<string> aFunction()
{
logger.Debug("Step 2");
return bFunction(CancellationToken.None);
}

AsyncLock myLock = new AsyncLock();
public async Task<string> bFunction(CancellationToken cToken)
{
using (await myLock(cToken))
{
logger.Debug("Step 3");
return "Hello";
}
}

一般来说,Task.Run() should be called从尽可能高的水平。尽可能保持同步,让调用者决定是否要使用后台线程。

关于c# - 等待任务完成后不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37218330/

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