0

我有一个来自我不拥有的 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();
        }
    }
    
4

1 回答 1

1

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

我建议将相关服务包含到另一个进程中,这样如果出现问题,您可以终止该进程。使用 IPC(共享内存?WCF?)与该进程进行通信。

于 2012-07-19T15:42:19.123 回答