Câu trả lời của tôi ở đây tương tự như câu trả lời tôi đăng here.
Bạn có thể thực hiện việc này bằng cách đợi chuỗi công nhân của mình từ một chuỗi giám sát trong một khoảng thời gian nhất định và sau đó mạnh mẽ giết chết chuỗi công nhân nếu nó chưa hoàn thành. Xem mã ví dụ bên dưới. Tuy nhiên, nói chung, việc tiêu diệt một luồng mạnh mẽ với Thread.Abort
không phải là một ý tưởng tốt vì luồng đích không nhất thiết phải ở trạng thái đã biết và có thể có các chốt mở cho các tài nguyên có thể không được giải phóng. Sử dụng Thread.Abort
là code smell.
Cách rõ ràng hơn là thay đổi chuỗi công nhân để quản lý tuổi thọ của chính công ty. Chuỗi công nhân có thể kiểm tra xem nó đã được thực thi tại các trạm kiểm soát nổi tiếng trong bao lâu và sau đó dừng lại nếu nó đã vượt quá giới hạn nào đó. Cách tiếp cận này có nhược điểm là yêu cầu nhiều trạm kiểm soát tiềm năng nằm rải rác trong toàn bộ công việc thực tế mà luồng đang thực hiện. Ngoài ra, chuỗi công nhân có thể dễ dàng vượt quá giới hạn bằng cách thực hiện quá nhiều tính toán giữa các điểm kiểm tra.
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);
}
}
Nguồn
2010-08-31 08:43:08