【发布时间】:2012-05-19 02:21:13
【问题描述】:
我在 控制台 应用程序(不确定这是否与此有关)和使用任务时遇到了一个奇怪的问题。
大多数示例显示故意调用异常来测试/解释 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 仍在等待 - 或者它可能是,这就是我错过的东西(它在等待什么)?
有任何想法、建议或残酷的更正吗?谢谢!
【问题讨论】:
-
我们需要更多地了解这些任务。您对 WaitAll 的理解是正确的,它要么在任务完成时返回,要么在任何任务中抛出异常。 (请注意,只有在所有任务完成后才会抛出异常)
-
sn-p 确实需要证明 foo 或 bar 正在引发异常。否则,使用调试器诊断此问题应该没有问题,它会清楚地显示您的 catch 块被命中。
-
附带说明,您不需要
(int)强制转换,在您的情况下,Result的类型已经是(int)。 -
谢谢大家 - 我会尽快回复您。我将通过@caesay 谈论任务挂起/不返回值 - 即使 foo 或 bar 确实做了他们需要做的事情,没有例外/已验证 - 所以我必须调查也许为什么两者都没有返回值。
标签: c# .net multithreading task-parallel-library task