我的问题在于一个任务完成了,但没有返回。我有一个网站和一个位于不同服务器上的Web服务。该网站调用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);
}
我对async和await不太熟悉,希望能得到帮助。
myFunction()
也应该是异步的。如果在异步调用上阻塞,可能会发生奇怪的事情。另外,为什么在bFunction
中使用Task.Run
? - Nate BarbettiniStep 4
不会被执行。 - JonesopolisTask.Run(async () =>{ })
来简化这部分代码。 - Nate Barbettini.GetAwaiter().GetResult()
会同步等待任务完成。请参考http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html获取更多信息。 - Yacoub Massad