[英]How do I execute multiple Tasks using Task Parallel Library and return after the first one to actually return data
[英]How to run multiple tasks and return the result once the first task returned true
如何编写一种异步运行某些任务的方法,检查给定任务的结果,并且一旦任务返回true
,该方法必须停止执行并返回结果。
假设我们得到了以下功能:
private static async Task<bool> DummyFunction()
{
Random rand = new Random(DateTime.Now.Millisecond);
Thread.Sleep(rand.Next(1000, 10000));
return await Task.FromResult(rand.Next(100) % 2 == 0);
}
接下来的一个将调用DummyFunction
private async Task<bool> RunDummy()
{
List<Task<bool>> tasks = new List<Task<bool>> { DummyFunction(), DummyFunction(), DummyFunction() };
while (tasks.Any())
{
Task<bool> currentTask = await Task.WhenAny(tasks);
if (await currentTask)
{
// do something ..., raise an event, call another method or whatever
// or simply just return
return true;
}
tasks.Remove(currentTask);
}
return false;
}
我在stackoverflow的某处找到了RunDummy
的代码。 但它宁可同步运行。 我尝试调试它,并注意到它在开始下一个任务之前等待每个任务完成。
我的问题是,如何并行运行所有任务并在返回true
第一个方法处停止执行?
使用Task.WhenAny
。 您的问题不是RunDummy
。
RunDummy
等待所有任务完成的原因是DummyFunction
并非真正异步。 行Thread.Sleep(rand.Next(1000, 10000));
实际上挂起线程。 请参阅Thread.Sleep
文档 -'将当前线程挂起指定的毫秒数'。
要使DummyFunction
异步,请使用await Task.Delay(1000)
。
还有一件事- await Task.FromResult(rand.Next(100) % 2 == 0)
的行也不是异步的。 Task.FromResult
创建完成的Task
然后等待完成的任务同步返回该值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.