当一项特定任务结束时让 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.
}