1

我正在运行一个 while 循环,它永远跟踪一些事件,如果我遇到任何异常,我会将其引用更改为 null,希望当前线程将被中止并创建该线程的新引用。中止当前线程并启动新线程是正确的还是更好的方法。

我正在尝试这样做:

Thread th;

Main()
{
    th = new thread(myfunction);
    th.Start();
}

void myfunction()
{
    while(true)
    {
        try
        {
            // something interesting here.
        }
        catch(exception)
        {
            th = null;
        }
    }
}
4

4 回答 4

1

清理该线程所需的任何内容,然后像这样跳出 while 循环:

void runningOnThread()
{
    while (true)
    {
        try
        {
            //...
        }
        catch (Exception e)
        {
            break;
        }
    }

    //thread cleanup code goes here, if you have any.
}

捕获异常时记录异常是个好主意。这样你就知道什么时候遇到了异常。

于 2012-05-11T05:07:31.940 回答
1

唯一会发生的事情是 Thread 将仍然无法从 Enclosure 类访问。

如果没有进一步的处理,这样做会使线程无法从 GC应用程序根中获取。这使得对象在下一次 GC 触发器中可用于垃圾收集。

于 2012-05-11T05:08:16.253 回答
1

你需要做:

return;

代替:

th = null;

因为线程将继续运行。线程对象不会被收集,因为只要代码正在运行,它就会一直被引用。

于 2012-05-11T05:08:54.403 回答
1

首先,如果遇到异常,在担心启动新线程之前,请确保您实际处理了异常并确保重新启动的线程能够成功运行。否则,你只会得到一个持续不断的崩溃线程流,以及一个在处理异常队列时断断续续的程序。只是一些思考的食物。

现在,回答这个问题,最好的情况是对线程的引用清零只会让你陷入无限循环,最坏的情况是你稍后尝试使用'th'并且你得到一个异常,因为它是空的。取消对线程的引用不会以某种方式让它意识到它需要重新启动自己,而不是取消对作为函数参数提供的参数的引用。如果您绝对需要某种中止/重新启动线程的能力,请考虑执行以下操作之一:

  1. 当线程崩溃并跳出 while 循环时引发事件,或者
  2. 设置一个布尔/枚举标志来说明线程正在做什么,并让主线程不时检查它以确保它没有被设置为错误状态。

这是代码完全不在我的脑海中,不是很好,但会给你一个大致的想法:

delegate void ThreadCrashedEvent();
Event ThreadCrashedEvent threadCrashed;

Thread th;

Main()
{
    threadCrashed += OnThreadCrashed();
    th = new thread(myfunction);
    th.Start();
}

void OnThreadCrashed()
{
    th = new thread(myfunction);
    th.Start();
}

void myfunction()
{
    while(true)
    {
      try
      {
          LetsGetDangerous();
      }
      catch(exception)
      {
          if(threadCrashed != null)
          {
              threadCrashed();
              return;
          }
      }
}
于 2012-05-11T05:21:05.753 回答