当我们将线程的引用更改为null时会发生什么?

时间:2012-05-11 05:03:28

标签: c# .net multithreading clr

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

我正在尝试这样做:

Thread th;

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

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

4 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

唯一会发生的事情是,Enclosing类仍然无法访问Thread。

如果没有进一步处理,这样做将使GC appllication roots无法访问该线程。这使得对象可用于下一个GC触发器中的垃圾收集。

答案 2 :(得分:1)

你需要这样做:

return;

而不是:

th = null;

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

答案 3 :(得分:1)

首先,如果遇到异常,在担心启动新线程之前,请确保实际处理异常并确保重新启动的线程能够成功运行。否则,你只会在处理异常游行时获得持续的崩溃线程和一个不稳定的程序。只是一些值得思考的东西。

现在,回答这个问题,最好的情况是对线程的引用进行归零会让你处于一个无限循环中,最糟糕的情况是你试着稍后使用'th'然后你得到一个异常,因为它是null。取消对线程的引用不会以某种方式让它意识到它需要重新启动自己,而不是将对作为函数参数的参数的引用置零。如果您绝对需要某种能力来中止/重新启动线程,请查看以下操作之一:

  1. 当线程崩溃并突然退出while循环时引发事件,或
  2. 设置一个boolean / enum标志,说明线程正在做什么,并经常检查主线程,以确保它没有被设置为错误状态。
  3. 这段代码完全脱离了我的头脑,不是那么好,但会给你一般的想法:

    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;
              }
          }
    }