Threading.Tasks: Concept of WaitAll()
本文关键字:WaitAll of Concept Tasks Threading | 更新日期: 2023-09-27 18:34:51
>我在控制台应用程序中遇到一个奇怪的问题(不确定这是否与此有关(并使用任务。
大多数示例显示故意调用异常来测试/解释 WaitAll 的概念 - 但就我而言,似乎我做错了什么(或者不完全理解(。
Task<int> task1 = Task<int>.Factory.StartNew(()=> foo(arg));
Task<int> task2 = Task<int>.Factory.StartNew(()=> bar(arg));
Task<int>[] tasks = {task1, task2};
try
{
Task.WaitAll(tasks); //hits this far
if((int)task1.Result * (int)task2.Result == 99) //this seems to never get hit
{
System.Environment.Exit(0); //so this isn't called
}
else
{
System.Environment.Exit(1); // neither is this called
}
}
catch
{
.....
在上面似乎没有命中if
块,因此既不返回退出代码 - 控制台应用程序因此挂起。
也没有抛出异常 - 我可以确认这一点,因为所有任务实际上都已完成 - 为了简洁起见,我只是没有包括上面的catch
部分。
任务很快就完成了 - 它们没有挂起,所以 Task.WaitAll 并不是还在等待 - 或者也许是,这就是我错过的东西(它在等待什么(?
有什么想法、建议或残酷的纠正吗?谢谢!
只是为了论证,我做了一个小测试(如下所示( - 它表明你的一个任务是挂起的,而不是返回值。
Task<int> task1 = Task<int>.Factory.StartNew(() =>
{
Thread.Sleep(2000);
return 10;
});
Task<int> task2 = Task<int>.Factory.StartNew(() => 15);
Task<int>[] tasks = {task1, task2};
try
{
Stopwatch sw = new Stopwatch();
sw.Start();
Task.WaitAll(tasks);
sw.Stop();
Console.WriteLine(String.Format("tasks completed in {0}ms", sw.ElapsedMilliseconds));
}
catch
{
Console.WriteLine("Error");
}
Console.ReadLine();
如果你运行它,它将打印tasks completed in 2000ms
(给或花几毫秒(。我所做的只是复制/粘贴您的代码并添加我自己的任务。
所以你说"The tasks are [...] not hanging..."
那是假的——他们一定是绞死的。
正如上面的caesay所解释的,任务必须是挂起的。为了检查这一点,我建议为您的 WaitAll 呼叫提供默认超时。您可以通过传入一个 int 来执行此操作,该 int 表示调用必须等待任务结束的毫秒数。试试这个
Task.WaitAll(tasks, 10000); //Set to wait for 10 seconds
然后查看是否有异常或您的"if"语句是否被命中。如果这有效,请尝试更大的时间间隔,看看任务发生了什么。
此外,我建议运行 foo 和 bar 中没有任务的代码(即顺序(作为测试工具,以了解这两个示例方法是否存在任何特定问题。