等待任务完成后不返回

时间:2016-05-13 19:51:57

标签: c# asynchronous

我遇到了一个任务正在完成但没有返回的问题。我在不同的服务器上有一个网站和一个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);
}

我是异步和等待的新手,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:6)

这几乎肯定是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可能来自最高级别。保持事物尽可能同步,让调用者决定是否要使用后台线程。