让 Task.WhenAny 在一个特定任务结束时返回



如何并行运行 2 个任务并在一个特定任务结束时收到通知(在我的例子中是列表中的第一个任务)

目前我正在使用以下代码:

await Task.WhenAny(A.Play(cancel), B.Play(cancel));

代码应在 A.Play(取消) 结束时返回,但不在 b.Play(取消) 结束时返回。

当任何不起作用,因为可能发生 B 在 A 之前结束的情况。 当所有不起作用时,因为 B 可能是一个无休止的任务。

我相信这会做你想要的。这些任务将并行运行,但您首先等待 aTask,因此它仅在 aTask 返回时返回。然后,您可以包含单独的逻辑来等待 bTask。

Task aTask = A.Play(cancel);
Task bTask = B.Play(cancel);
// will return only when A is complete. 
await aTask;
// await bTask seperately. 

您可以使用

B.Play() 

没有await运行B而不等待它结束然后做

await A.Play()

您可以将"A.Play"包装在一个新的任务方法中,该方法在"A.Play"完成后执行任何您想要的操作。

async Task CallingMethod()
{
await Task.WhenAny(WrapperA(), B.Play(cancel));
}
async Task WrapperA()
{
await A.Play(cancel)
// Here you can fire an event or set the cancellation token
// Or whatever you want.
}

最新更新