我有一个名为t1的主线程:
Thread t1 => new Thread(UpdateResults);
执行名为UpdateResult
的方法的此方法需要互联网连接。现在有时连接可能会被破坏。
当连接断开时,方法UpdateResult
返回异常,线程t1
终止执行。
我需要再次执行线程t1
所以我想创建另一个线程t2
,如果线程t1
正在运行或者没有,则递归检查。
两个线程都是自动启动的。这是线程t2
方法的代码:
while (true)
{
if (!t1.IsAlive)
{
t1.Start();
}
}
这段代码不幸地减慢了应用UI的速度,原因是无限循环。 我可以做些什么来解决这个问题?
答案 0 :(得分:2)
您可以考虑更改帖子t2
的方法,而不是浪费另一个帖子t1
来观看t1
:
Thread t1 = new Thread(o =>
{
while (true)
{
try
{
UpdateResult();
}
catch (Exception)
{
// do some error handling
}
Thread.Sleep(100);
}
});
所以你捕获异常(而不重新抛出它!)并防止整个线程崩溃。
这当然只是一个简单的例子。您应该尝试仅捕获断开连接的特定异常并添加正确的错误处理(例如日志记录等) 并根据您的需要调整线程应该睡觉的时间。
答案 1 :(得分:2)
避免无限轮询的一种方法是Join
线程,并在停止时重新生成它:
while (true) {
t1.Join();
t1 = ... // Make a replacement thread
t1.Start();
}
不言而喻,这不应该在UI线程中完成,因为Join()
会无限期地阻塞。
答案 2 :(得分:1)
如果您想坚持使用您的架构,那么在Thread 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()
并在异常发生的地方捕捉异常,然后做出相应的反应(虽然这可以说更容易)。