Ответ 1
Мой ответ здесь похож на тот, который я опубликовал здесь.
Вы можете сделать это, ожидая своего рабочего потока из потока мониторинга в течение определенного времени и затем принудительно убивая рабочий поток, если он еще не завершен. См. Пример кода ниже.
В общем, однако, убийство потока с помощью Thread.Abort
не является хорошей идеей, так как целевой поток не обязательно находится в и может иметь открытые ручки для ресурсов, которые могут быть освобождены. Использование Thread.Abort
- это запах кода.
Более чистый способ - изменить рабочий поток, чтобы управлять его собственным временем жизни. Рабочий поток мог проверить, сколько времени он выполнил на известных контрольных точках, а затем остановится, если он превысил некоторый предел. Этот подход имеет недостаток, требующий потенциально много контрольных точек, разбросанных по всей фактической работе, выполняемой нитью. Кроме того, рабочий поток может легко превышать предел, делая слишком много вычислений между контрольными точками.
class Program
{
static void Main(string[] args)
{
if (RunWithTimeout(LongRunningOperation, TimeSpan.FromMilliseconds(3000)))
{
Console.WriteLine("Worker thread finished.");
}
else
{
Console.WriteLine("Worker thread was aborted.");
}
}
static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout)
{
Thread workerThread = new Thread(threadStart);
workerThread.Start();
bool finished = workerThread.Join(timeout);
if (!finished)
workerThread.Abort();
return finished;
}
static void LongRunningOperation()
{
Thread.Sleep(5000);
}
}