我遇到了一个任务正在完成但没有返回的问题.我在不同的服务器上有一个网站和一个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);
}
Run Code Online (Sandbox Code Playgroud)
我是异步和等待的新手,所以任何帮助都将不胜感激.
这几乎肯定是一个僵局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";
}
}
Run Code Online (Sandbox Code Playgroud)
一般来说,Task.Run()应该从最高级别调用.保持事物尽可能同步,让调用者决定是否要使用后台线程.