C#防止在完成之前再次运行异步任务

时间:2017-04-09 10:49:18

标签: c# asynchronous

我似乎无法找到即时寻找in the documentation的信息,并且可以使用第二双眼睛。我想在没有测试的情况下这样做;只是视觉检验和理论讨论。

我的草稿尝试设置了一个bool,它只允许在返回的任务将其值设置为Task.IsCompleted时运行异步方法。我的问题是,这段代码是否会按照我的假设执行,如果没有,那么一次只执行一次调用的替代方案是什么? (假设无限循环和异步任务保持不变)

您可以公平地假设RunAsync()是一个异步方法,由async关键字表示,包含一个返回Task实例的等待任务。

bool asyncOutputCallAllowed = true;

while (true)
{           
    if (asyncOutputCallAllowed)
    {
        asyncOutputCallAllowed = false;
        asyncOutputCallAllowed = RunAsync().IsCompleted;
    } 
}

1 个答案:

答案 0 :(得分:2)

我猜您正在尝试执行以下操作:进行异步调用,保持循环并执行其他操作,同时等待异步任务完成,然后在上一个任务完成时启动新的异步任务。如果是这样,那么你可能想要以下几行:

Task activeOperation = null;
while (true)
{
    if (activeOperation == null)
    {
        // No async operation in progress. Start a new one.
        activeOperation = RunAsync();
    }
    else if (activeOperation.IsCompleted)
    {
        // Do something with the result.

        // Clear active operation so that we get a new one
        // in the next iteration.
        activeOperation = null;
    }

    // Do some other stuff
}

根据您的确切算法,您可能希望在上一个完成的同一迭代中启动新任务。这只是上面的一小部分调整。

如果除了等待异步任务之外你没有在循环中做任何其他事情,那么你可以完全摆脱循环并改为使用延续(参见ContinueWith)。