Trong một ứng dụng tôi đang phát triển, tôi có một biểu mẫu chính chỉ đơn giản là ngồi đó và hiển thị dữ liệu nhật ký, và một chuỗi công nhân tự động thực hiện công việc trong một vòng lặp.Gracefully shutdown thread
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;
Như bạn có thể thấy, bất cứ khi nào biểu mẫu được đóng, chuỗi công nhân phải dừng lại. Công nhân trông giống như sau:
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;
}
}
}
}
Như bạn thấy, tôi muốn chủ đề có thể dừng khi chuyển đổi giữa các hoạt động liên tiếp, nhưng không phải khi hoạt động. Khi một hoạt động (DoExtensiveWorkN
) kết thúc, trạng thái và kết quả của nó được duy trì làm đĩa hoặc cơ sở dữ liệu, vì vậy thoát trong khi đang hoạt động (ví dụ: Thread.Abort
) không phải là một tùy chọn.
Tuy nhiên, tôi tìm thấy mã này tôi vừa viết để xem, đặc biệt là "vòng lặp chờ" ngủ 900 giây, để ngăn chặn chuỗi không hoạt động trong 15 phút trước khi phát hiện Running
được đặt thành false
.
Tôi muốn có thể ném một số loại sự kiện để dừng vòng lặp chính ngay sau khi hoàn thành một tác phẩm.
Bất cứ ai có thể chỉ cho tôi đúng hướng để làm điều này, hoặc nếu viết lại toàn bộ là bắt buộc vì tôi hoàn toàn hiểu lầm luồng, hãy chỉ cho tôi một nơi nào đó mà các nguyên tắc đó được giải thích?
Bộ hẹn giờ sẽ không giải quyết được vấn đề chính mà tôi gặp phải: Tôi không muốn công việc tiếp tục khi biểu mẫu bị đóng và tôi không muốn thêm nhiều mã để tiếp tục kiểm tra. – CodeCaster
@CodeCaster: Ah, tôi hiểu lầm "vì vậy bỏ trong khi một hoạt động đang được tiến hành (bởi, ví dụ, Thread.Abort) không phải là một lựa chọn" để có nghĩa là toàn bộ chủ đề. Suy nghĩ của tôi sau đó sẽ sử dụng một loạt các hành động nhưng Iridium đánh tôi với nó. Tôi vẫn thích bộ đếm thời gian chờ đợi 15 phút. :) – Chris
Tôi có thể mô tả rõ ràng hơn. Nhờ đề nghị mặc dù. :-) – CodeCaster