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

C# 检查线程是否以递归方式运行?,c#,C#,我有一个叫做t1的主线程: Thread t1 => new Thread(UpdateResults); 执行名为UpdateResult的方法时,此方法需要internet连接。现在,有时连接可能会断开 当连接断开时,方法UpdateResult返回异常,线程t1终止执行 我需要再次执行线程t1,因此我想创建另一个线程t2,该线程递归检查线程t1是否正在运行 两个线程都会自动启动。这是线程t2方法的代码: while (true) { if (!t1.IsAlive)

我有一个叫做t1的主线程:

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如果捕获到异常,则不会抛出任何东西。我非常喜欢这个解决方案,在代码中似乎工作得很好。谢谢大家;)唉,我对名誉的卑微追求又一次被更快的海报挫败了。无论如何,谢谢你的时间。谢谢^^^一些冗余从来不会有什么坏处。