Moja odpowiedź tutaj jest podobna do tej, którą opublikowałem here.
Można to zrobić, czekając na wątek roboczy z wątku monitorowania przez określony czas, a następnie zdecydowanie zabijając wątek roboczy, jeśli jeszcze nie został ukończony. Zobacz przykładowy kod poniżej.
Generalnie jednak zabijanie wątku z użyciem Thread.Abort
nie jest dobrym pomysłem, ponieważ docelowy wątek niekoniecznie znajduje się w znanym stanie i może mieć otwarte uchwyty dla zasobów, które mogą nie zostać zwolnione. Używanie Thread.Abort
jest .
Sprytniejszym sposobem jest zmiana wątku roboczego w celu zarządzania własnym życiem. Wątek roboczy może sprawdzić, ile czasu wykonał w dobrze znanych punktach kontrolnych, a następnie przestać, jeśli przekroczył pewien limit. Takie podejście ma tę wadę, że wymaga potencjalnie wielu punktów kontrolnych rozproszonych w trakcie rzeczywistej pracy wykonywanej przez wątek. Ponadto wątek roboczy może z łatwością przekroczyć limit, wykonując zbyt wiele obliczeń między punktami kontrolnymi.
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);
}
}