在我正在開發的一個應用程序中,我有一個簡單的坐在那裏並顯示日誌數據的主窗體,以及一個自主完成循環工作的工作線程。優雅地關閉了一個線程
MyWorker worker = new MyWorker();
MainForm mainForm = new MainForm();
// Subscribe form to log event so log data gets displayed
worker.Log += mainForm.Log;
// Start the worker thread's MainLoop
new Thread(new ThreadStart(worker.MainLoop)).Start();
// Show the form (blocking)
Application.Run(mainForm);
// If we end up here, the form has been closed and the worker has to stop running
worker.Running = false;
正如您所看到的,只要窗體關閉,工作線程應該停止。這名工人是這樣的:
public class MyWorker
{
public String Running { get; set; }
public MyWorker()
{
Running = true;
}
public void MainLoop()
{
while (Running)
{
DoExtensiveWork1();
if (!Running) return;
DoExtensiveWork2();
if (!Running) return;
DoExtensiveWork3();
if (!Running) return;
DoExtensiveWork4();
if (!Running) return;
DoExtensiveWork5();
if (!Running) return;
// We have to wait fifteen minutes (900 seconds)
// before another "run" can be processed
for (int i = 0; i < 900; i++)
{
Thread.Sleep(1000);
if (!Running) return;
}
}
}
}
正如你所看到的,我想線程能夠連續工作的操作之間切換時停止,而不是在一個操作中。當一個操作(DoExtensiveWorkN
)完成時,其狀態和結果將保留在磁盤或數據庫中,因此在操作正在進行時退出(例如,通過Thread.Abort
)不是選項。
但是,我發現這段代碼我剛剛寫了一些令人厭惡的代碼,特別是睡眠時間爲900秒的「等待循環」,以防止線程在檢測到Running
已被設置爲false
。
我寧願能夠拋出某種事件來完成一項工作後立即停止主循環。
任何人都可以指出我正確的方向如何做到這一點,或者如果因爲我完全誤解了線程而需要全部重寫,請告訴我某處解釋這些原則的地方?
定時器不會解決我遇到的主要問題:我不希望工作在表單關閉時繼續進行,並且我不想添加大量代碼來檢查該問題。 – CodeCaster
@CodeCaster:啊,我誤解了「在操作正在進行時退出(例如,通過Thread.Abort)不是一個選項」來表示整個線程。我的想法然後會使用一系列的行動,但銥星擊敗了我。儘管如此,我仍然更喜歡15分鐘的計時器。 :) – Chris
我可以更清楚地描述。 (還是)感謝你的建議。 :-) – CodeCaster