当一项特定任务结束时让 Task.WhenAny return
Let Task.WhenAny return when one specific task ends
我如何运行 并行执行 2 个任务并在一个特定任务结束时得到通知(在我的例子中是列表中的第一个任务)
目前我正在使用这个代码:
await Task.WhenAny(A.Play(cancel), B.Play(cancel));
当 A.Play(cancel) 结束时,代码应该 return,但当 b.Play(cancel) 结束时,代码应该 return。
WhenAny 不起作用,因为 B 可能会在 A 之前结束。
WhenAll 不起作用,因为 B 可能是一个无休止的任务。
我相信这会如你所愿。任务将 运行 并行,但您首先等待 aTask,因此它 returns 仅当 aTask returns 时。然后,您可以包含单独的逻辑来等待 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()
without await
to 运行 B
without waiting it to end and then do
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.
}
我如何运行 并行执行 2 个任务并在一个特定任务结束时得到通知(在我的例子中是列表中的第一个任务)
目前我正在使用这个代码:
await Task.WhenAny(A.Play(cancel), B.Play(cancel));
当 A.Play(cancel) 结束时,代码应该 return,但当 b.Play(cancel) 结束时,代码应该 return。
WhenAny 不起作用,因为 B 可能会在 A 之前结束。 WhenAll 不起作用,因为 B 可能是一个无休止的任务。
我相信这会如你所愿。任务将 运行 并行,但您首先等待 aTask,因此它 returns 仅当 aTask returns 时。然后,您可以包含单独的逻辑来等待 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()
without await
to 运行 B
without waiting it to end and then do
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.
}