Я использую этот код, чтобы дать лимит времени для другого потока и прервать его по истечении определенного времени:Получение текущей строки из другой управляемой нити
void RunWithTimeout(Action action, TimeSpan timeout)
{
AutoResetEvent signal = new AutoResetEvent(false);
Thread workerThread = null;
ThreadPool.QueueUserWorkItem((o) =>
{
workerThread = Thread.CurrentThread;
action();
signal.Set();
});
using (new Timer((o) => { signal.Set(); }, null, (int)timeout.TotalMilliseconds, Timeout.Infinite))
{
signal.WaitOne();
}
if (workerThread != null && workerThread.IsAlive)
{
try
{
workerThread.Abort();
}
catch { }
throw new System.TimeoutException();
}
}
Я использую .NET 3.5, так что я не могу use Tasks Я бросаю TimeoutException сейчас, но я хотел бы знать строку, которая выполнялась при вызове Abort
.
Есть ли способ получить стопку вызовов другого потока и передать его в свойствоисключения?
Хм, довольно нездоровая предположить, что существует на самом деле * есть * а «текущая строка» когда код должен быть прерван. Он почти наверняка похоронен во внутренней функции CLR или операционной системы. Вид, необходимый для того, чтобы потоки зависали и не выполняли свою работу вовремя. Отмена потоков опасна, в ней есть миллион предупреждений. –
Отмена нитей настолько чревата ошибкой, что вы не должны этого делать, кроме как в тяжелых обстоятельствах. Если у вас есть контроль над кодом, вы должны написать поток, чтобы поддержать некоторые способы совместной отмены. В .NET 4.0 вы можете использовать «CancellationToken». В более ранних версиях используйте 'WaitHandle'. См. Мой пост в блоге, [Опрос для отмены] (http://blog.mischel.com/2013/05/07/polling-for-cancellation/) –