【发布时间】:2016-09-10 03:24:51
【问题描述】:
我遇到了一个任务正在完成但没有返回的问题。我在不同的服务器上有一个网站和一个 Web 服务。该网站调用具有函数 myFunction() 的库的 Web 服务。如果我从 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);
}
我是 async 和 await 的新手,因此我们将不胜感激。
【问题讨论】:
-
如果可能,
myFunction()也应该是异步的。如果您阻止异步调用,可能会发生奇怪的事情。另外,为什么bFunction中的Task.Run业务? -
没有理由不在这里执行
Step 4 -
@NateBarbettini 我不知道为什么要使用 Task.Run 的东西。我试图尽可能地简化代码,但你确实让我注意到了一个可能很重要的部分。我正在重用为同步任务编写的异步代码。在没有异步内容的情况下重写所有内容将是一项艰巨的任务。
-
一般来说,混合同步+异步是个坏主意。理想的解决方案是使其全部异步或全部同步。除了您可以摆脱
Task.Run(async () =>{ })以大大简化该部分之外,我没有看到您的示例有任何其他问题。 -
很可能您遇到了死锁,因为您混合了同步和异步代码。
.GetAwaiter().GetResult()正在同步等待任务完成。请参阅blog.stephencleary.com/2012/07/dont-block-on-async-code.html 了解更多信息
标签: c# asynchronous