gpt4 book ai didi

c# - 如何等待有条件的任务?

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:42 24 4
gpt4 key购买 nike

我有一些返回 bool 值的任务。我只想等到任何任务首先返回 True 时。是否可以 ?

我的第一个想法是使用 CancellationTokenSource,但这不是一个好主意,因为它会在我调用 Task.WaitAll 方法时引发异常。

第二种选择是使用我传入的 bool 引用,如果为真,则直接返回。它有效但性能不佳:

bool isFound = false;
Task<bool> t0 = Task.Factory.StartNew<bool>(() => Find(paramA, paramB, ref isFound));
Task<bool> t1 = Task.Factory.StartNew<bool>(() => Find(paramC, paramD, ref isFound));
Task<bool> t2 = Task.Factory.StartNew<bool>(() => Find(paramE, paramF, ref isFound));
Task<bool> t3 = Task.Factory.StartNew<bool>(() => Find(paramG, paramH, ref isFound));

Task.WaitAll(new Task[] { t0, t1, t2, t3, t4 });
return t0.Result | t1.Result | t2.Result | t3.Result | t4.Result;

在方法中:

 private static bool Find(int[,] m1, int[,] m2, ref bool isFound)
{
if (isFound)
return false;

// Do work...
}

编辑:

作为预先确定的答案,我使用 TaskCompletionSource<bool>现在:

TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
Task<bool> t0 = Task.Factory.StartNew<bool>(() => Find(paramA, paramB);
Task<bool> t1 = Task.Factory.StartNew<bool>(() => Find(paramC, paramD);
Task<bool> t2 = Task.Factory.StartNew<bool>(() => Find(paramE, paramF);
Task<bool> t3 = Task.Factory.StartNew<bool>(() => Find(paramG, paramH);

t0.ContinueWith(_ =>
{
if (t0.Result)
tcs.TrySetResult(t0.Result);
});

t1.ContinueWith(_ =>
{
if (t1.Result)
tcs.TrySetResult(t1.Result);
});

t2.ContinueWith(_ =>
{
if (t2.Result)
tcs.TrySetResult(t2.Result);
});

t3.ContinueWith(_ =>
{
if (t3.Result)
tcs.TrySetResult(t3.Result);
});

t4.ContinueWith(_ =>
{
if (t4.Result)
tcs.TrySetResult(t4.Result);
});

tcs.Task.Wait();
return tcs.Task.Result;

在这种情况下,当所有任务都返回false时,什么也没有注意到,这是正常的。但是我不知道如何使用 WhenAll方法。我试着添加这个:

tcs.Task.Wait();
Task tr = Task.WhenAll(new Task[] { t0, t1, t2, t3, t4 });

if (tr.IsCompleted)
return false;
else
return tcs.Task.Result;

但它不起作用:(

最佳答案

一个选择是创建一个你想要的任何类型的 TaskCompletionSource(如果需要的话,用于识别结果)。然后为每个任务添加一个延续,调用 TaskCompletionSource.TrySetResult如果结果为真。

然后等待 TaskCompletionSource.Task。它避免了你不得不调用 Task.WaitAny反复检查结果等

棘手的一点是当所有 任务都返回 false 时...在 .NET 4.5 中这会相当容易,通过 Task.WhenAll 创建另一个任务- 然后你只需等待第一个 { success, all failed } 完成。

关于c# - 如何等待有条件的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11824755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com