我有一个来自我不拥有的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();
}
}
答案 0 :(得分:1)
在您自己的进程中中止线程是危险的。 (以及在其他进程中。)线程可能拥有一些锁,可能正在更新关键结构等等。所以这不是要走的路。
我建议将有问题的服务包含在另一个进程中,以便在出现问题时可以终止该进程。使用IPC(共享内存?WCF?)与该进程进行通信。