Я собрал воедино решение, подобное тому, с которым связано, за исключением того, что я использовал Thread.Interrupt () вместо Thread.Abort (), полагая, что это будет немного добрее для основного потока.Проблема в том, что Thread.Interrupt () не будет прерывать заблокированный вызов, поэтому во многих случаях это неудовлетворительно.Thread.Abort () является опасным вызовом, и его следует по возможности избегать.Выбери свой яд.
Для чего это стоит, это моя реализация:
public static class AbortableProc
{
public static void Execute(Action action, Action timeoutAction, int milli)
{
Thread currThread = Thread.CurrentThread;
object stoppedLock = new object();
bool stopped = false;
bool interrupted = false;
Thread timer = new Thread(() =>
{
Thread.Sleep(milli);
lock (stoppedLock)
{
if (!stopped)
{
currThread.Interrupt();
stopped = true;
interrupted = true;
}
}
});
timer.Start();
try
{
action();
lock (stoppedLock)
{
stopped = true;
}
}
catch (ThreadInterruptedException)
{
}
if (interrupted)
{
timeoutAction();
}
}
}
Для ухмылок я добавил timeoutAction, чтобы ты мог использовать его в этом режиме:
AbortableProc.Execute(
() => { Process(kStarting); Process(kWorking); Process(kCleaningUp); },
() => { if (IsWorking()) CleanUp(); }
};