【发布时间】:2012-06-01 02:54:57
【问题描述】:
我在线程中有线程,最后一个子线程只是挂起,现在 20 小时内没有抛出任何东西。我的代码是这样的:
bool end = false;
var t1 = new Thread(() =>
{
// ...
var t2 = new Thread(() =>
{
try
{
foreach(Data data in datas2)
{
foreach(SubData subdata in data.SubDatas)
{
var t3 = new Thread(() =>
{
this.SaveData(subdata.RetrieveData());
}); t3.Start();
if (!t3.Join(1800000))
{
t3.Abort();
throw new TimeoutException("The execution of method is taking too long.");
}
}
}
} catch { throw; }
finally { end = true; }
}); t2.Start();
}); t1.Start();
它永远不会通过t2 的finally 块,也不会抛出任何错误。这里发生了什么?
我的代码使用 C#,框架 4,在 Visual Studio 2010 Pro 中构建。
请帮忙。提前致谢。
编辑:
感谢大家的帮助。我找到了答案,它是
无限循环。
因为这个愚蠢的错误,我们的生产停了一周。啊。似乎我们的系统上有一个验证,它只为某些数据创建一个无限循环。感谢大家热心解答这个问题。
【问题讨论】:
-
t3是否完成执行?你什么时候使用end变量? -
取决于 SaveData 和 RetrieveData 中发生的情况
-
@YoryeNathan
t3没有完成执行。我有另一个线程检查t2是否已结束。end实际上是一个类型为private volatile bool的类变量。 -
圆括号不平衡。您的示例中没有显示哪部分代码?
-
看起来很适合 Tasks Parallel Library (msdn.microsoft.com/en-us/library/dd460717.aspx)。
标签: c# multithreading .net-4.0