管理观察者线程 - 如何引发异常&加入工作?

时间:2012-07-19 15:39:12

标签: c# multithreading watchdog threadabortexception

我有一个来自我不拥有的API的登录过程偶尔会挂起。如果它花费的时间超过30秒,我想杀死它并重试(因为它应该只需要2-3个)。

我对堕胎线程如何工作以及堕胎后是否需要加入我有点困惑。这是我的问题,然后是我正在尝试做的一个例子:

问题:

  1. Abort在其调用的线程中抛出线程中止异常。这会传播吗?我是否需要在调用线程中显式处理它或者线程是否会死掉?

  2. 我是否需要加入一个已中止的线程,以便它不会僵尸化,或者我只是对* NIX编程世界感到困惑?

    public static Session GetSession()
    {
        Session session = new Session("user", "pass");
    
        try
        {
            //Create a thread to get the session so we can kill it if it hangs.
            Thread thread = new Thread(() => session.Logon());
    
            //Create a thread to kill the session thread if it hangs.
            Thread watcher = new Thread(() => HangKill(thread));
    
            //Start both threads.
            thread.Start();
            watcher.Start();
    
            //Wait for session thread to finish - abort kill thread if it does.
            thread.Join();
            watcher.Abort();
            watcher.Join();
        }
        catch (Exception ex)
        {            
            status = ex.ToString();
        }
    
        return session;
    }
    
    
    public static void HangKill(Thread t)
    {
        Thread.Sleep(30);
    
        if (t.IsAlive == true)
        {
            t.Abort();
        }
    }
    

1 个答案:

答案 0 :(得分:1)

在您自己的进程中中止线程是危险的。 (以及在其他进程中。)线程可能拥有一些锁,可能正在更新关键结构等等。所以这不是要走的路。

我建议将有问题的服务包含在另一个进程中,以便在出现问题时可以终止该进程。使用IPC(共享内存?WCF?)与该进程进行通信。