我似乎无法找到即时寻找in the documentation的信息,并且可以使用第二双眼睛。我想在没有测试的情况下这样做;只是视觉检验和理论讨论。
我的草稿尝试设置了一个bool,它只允许在返回的任务将其值设置为Task.IsCompleted
时运行异步方法。我的问题是,这段代码是否会按照我的假设执行,如果没有,那么一次只执行一次调用的替代方案是什么? (假设无限循环和异步任务保持不变)
您可以公平地假设RunAsync()
是一个异步方法,由async关键字表示,包含一个返回Task
实例的等待任务。
bool asyncOutputCallAllowed = true;
while (true)
{
if (asyncOutputCallAllowed)
{
asyncOutputCallAllowed = false;
asyncOutputCallAllowed = RunAsync().IsCompleted;
}
}
答案 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
)。