Vấn đề tuyên bốLàm thế nào để chấm dứt một sợi công nhân một cách chính xác trong C#
Tôi có một sợi nhân viên rằng về cơ bản quét một thư mục, đi sâu vào các tập tin bên trong nó, và sau đó ngủ một thời gian. Quá trình quét có thể mất 2-3 giây nhưng không nhiều hơn nữa. Tôi đang tìm một cách để ngăn chặn chủ đề này một cách thanh lịch.
Làm rõ: Tôi muốn dừng thread khi nó ngủ, và không phải là lúc nó quét. Tuy nhiên, vấn đề là tôi không biết trạng thái hiện tại của luồng. Nếu nó đang ngủ tôi muốn nó thoát ngay lập tức. Nếu nó đang quét, tôi muốn nó thoát khỏi thời điểm nó cố chặn.
Nỗ lực tại một giải pháp
Lúc đầu, tôi đã sử dụng giấc ngủ và ngắt. Sau đó, tôi phát hiện ra rằng gián đoạn không thực sự làm gián đoạn giấc ngủ - nó chỉ hoạt động khi các chủ đề TRIES đi vào giấc ngủ.
Vì vậy, tôi đã chuyển sang Monitor Wait & Pulse. Sau đó, tôi phát hiện ra rằng Pulse chỉ hoạt động khi tôi thực sự ở trong Wait. Vì vậy, bây giờ tôi có một sợi trông giống như vậy:
while (m_shouldRun)
{
try
{
DoSomethingThatTakesSeveralSeconds();
lock (this)
{
Monitor.Wait(this, 5000);
}
}
catch (ThreadInterruptedException)
{
m_shouldRun = false;
}
}
Và bây giờ tôi cần phải thủ công chức năng Dừng của tôi. Vì vậy, tôi bắt đầu với:
public void Stop()
{
m_shouldRun = false;
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}
Nhưng điều này không hoạt động vì tôi có thể đang rung khi chủ đề hoạt động (trong khi không chờ). Vì vậy, tôi đã thêm Interrupt:
public void Stop()
{
m_shouldRun = false;
thread.Interrupt();
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}
Một lựa chọn khác là sử dụng:
public void Stop()
{
m_shouldRun = false;
while (!thread.Join(1000))
{
lock (this)
{
Monitor.Pulse(this);
}
}
}
Câu hỏi
phương pháp ưa thích là gì? Có phương pháp thứ ba nào thích hợp hơn không?
"* Lúc đầu, tôi đã sử dụng giấc ngủ và Interrupt Sau đó, tôi phát hiện ra rằng Ngắt không thực sự làm gián đoạn giấc ngủ - nó chỉ hoạt động khi các chủ đề TRIES đi ngủ. * "Thật kỳ lạ. Đây có phải là một lỗi được biết đến? Nếu nó không phải là, bạn có thể cố gắng để tái sản xuất nó với một ví dụ đồ chơi? – Heinzi