检查线程是否以递归方式运行?

时间:2016-08-29 14:33:00

标签: c#

我有一个名为t1的主线程:

Thread t1 => new Thread(UpdateResults);
执行名为UpdateResult的方法的

此方法需要互联网连接。现在有时连接可能会被破坏。

当连接断开时,方法UpdateResult返回异常,线程t1终止执行。

我需要再次执行线程t1所以我想创建另一个线程t2,如果线程t1正在运行或者没有,则递归检查。

两个线程都是自动启动的。这是线程t2方法的代码:

while (true)
{
    if (!t1.IsAlive)
    {
       t1.Start();
    }
}

这段代码不幸地减慢了应用UI的速度,原因是无限循环。 我可以做些什么来解决这个问题?

3 个答案:

答案 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()并在异常发生的地方捕捉异常,然后做出相应的反应(虽然这可以说更容易)。