У меня есть процесс входа в систему из 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(); } }
Thread.Abort()
крайне опасен. - person SLaks   schedule 19.07.2012