C# 检查线程是否以递归方式运行?
我有一个叫做t1的主线程:C# 检查线程是否以递归方式运行?,c#,C#,我有一个叫做t1的主线程: Thread t1 => new Thread(UpdateResults); 执行名为UpdateResult的方法时,此方法需要internet连接。现在,有时连接可能会断开 当连接断开时,方法UpdateResult返回异常,线程t1终止执行 我需要再次执行线程t1,因此我想创建另一个线程t2,该线程递归检查线程t1是否正在运行 两个线程都会自动启动。这是线程t2方法的代码: while (true) { if (!t1.IsAlive)
Thread t1 => new Thread(UpdateResults);
执行名为UpdateResult
的方法时,此方法需要internet连接。现在,有时连接可能会断开
当连接断开时,方法UpdateResult
返回异常,线程t1
终止执行
我需要再次执行线程t1
,因此我想创建另一个线程t2
,该线程递归检查线程t1
是否正在运行
两个线程都会自动启动。这是线程t2
方法的代码:
while (true)
{
if (!t1.IsAlive)
{
t1.Start();
}
}
这段代码不幸地减慢了应用程序界面的速度,因为这是一个无限循环。
我能做什么而不是修复这个问题?< /p> < p>而不是浪费另一个线程<代码> T2<代码>,只是为了观察<代码> T1 < /C> >,您可以考虑更改线程<代码> T1 < /C> >:< /P>
Thread t1 = new Thread(o =>
{
while (true)
{
try
{
UpdateResult();
}
catch (Exception)
{
// do some error handling
}
Thread.Sleep(100);
}
});
因此,您可以捕获异常(无需重新引用它!),并防止整个线程崩溃
这当然只是一个简单的例子。您应该尝试只捕获断开连接的特定异常,并添加正确的错误处理(例如日志记录等)。并根据需要调整线程的睡眠时间。避免无限轮询的一种方法是加入线程,并在线程停止时重新生成它:
while (true) {
t1.Join();
t1 = ... // Make a replacement thread
t1.Start();
}
不用说,这不应该从UI线程执行,因为
Join()
会无限期地阻塞。如果您想坚持您的体系结构,只需在线程t2的每个循环中等待一秒钟就可以极大地提高性能
while (true)
{
if(!t1.isAlive)
{
t1.Start();
}
Thread.Sleep(1000);
}
(您可以根据您的上下文调整时间以适应任何有意义的情况。)
虽然不是这个多线程解决方案,但我会问:为什么线程t1会因为异常而终止?您可以使用try
-catch
块捕获它
而不是UpdateResults
调用SafeUpdateResults
,它只是说:
void SafeUpdateResults()
{
while (true)
{
try { UpdateResults(); }
catch (Exception e)
{
//track the Error if you want
Console.WriteLine("t1-Error: " + e.Message);
}
}
}
我甚至建议,进入函数
UpdateResults()
并在异常发生的地方捕获异常,然后做出相应的反应(尽管这可能更容易)。在try..catch
块中包装UpdateResults
?@BlackBear已经在try-catch块中,但是,如果出现异常,线程将终止执行。我想让updateresults
执行重试/连接,而不是线程。线程应该就在工作完成的地方,而不是让测试人员知道它是否完成了,我想。@AgainMe如果捕获到异常,则不会抛出任何东西。我非常喜欢这个解决方案,在代码中似乎工作得很好。谢谢大家;)唉,我对名誉的卑微追求又一次被更快的海报挫败了。无论如何,谢谢你的时间。谢谢^^^一些冗余从来不会有什么坏处。