我有一个来自我不拥有的 API 的登录过程,该过程偶尔会挂起。如果它花费的时间超过 30 秒,我想杀死它并重试(因为它应该只需要大约 2-3 秒)。
我对中止线程的工作原理以及是否需要在中止后加入感到有些困惑。这是我的问题,然后是我正在尝试做的示例:
问题:
Abort 在其调用的线程中引发线程中止异常。这会传播吗?我需要在调用线程中显式处理它还是线程只是死了?
我是否需要加入一个中止的线程以使其不会僵化,或者我只是对 *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(); } }