2010-03-04 35 views
5

Tôi có một chuỗi công nhân rất quan trọng cho đơn xin của tôi.
Nó được tạo ra với new Thread(method).Start(); Tôi không tham gia, tôi chỉ mong đợi điều đó sẽ chạy miễn là chương trình của tôi chạy.
Tuy nhiên, nó có thể xảy ra rằng có một ngoại lệ bị bắt trên chủ đề này; và như một kết quả, thread sẽ (bên cạnh một số lần đăng nhập cuối cùng) tắt máy. Không thể khôi phục được lỗi nghiêm trọng này. Kể từ khi thread là rất quan trọng cho các ứng dụng, nó đã tắt máy, quá.Làm thế nào để theo dõi một sợi công nhân quan trọng

Bây giờ câu hỏi của tôi là: Làm cách nào để theo dõi trạng thái luồng của tôi?

bạn sẽ

  • Thăm dò ý kiến ​​các IsAlive bất động sản?
  • xem xét lại ngoại lệ bị bắt và làm việc với AppDomain.CurrentDomain.UnhandledException?
  • triển khai event sẽ báo hiệu kết thúc chuỗi nền của tôi?
  • sử dụng BackgroundWorker, triển khai RunWorkerCompleted? (Nhưng là một BackgroundWorker thực sự là sự lựa chọn đúng cho các chủ đề chạy dài?)
  • một cái gì đó hoàn toàn khác?

EDIT:
Ngay bây giờ, tôi giải quyết vấn đề bằng cách gọi Application.Exit() ->sụp đổ sớm và thường xuyên. Đó là một lựa chọn, quá :)

Trả lời

2

Tại sao bạn không quấn thói quen chủ đề chính của bạn như thế này:

void ThreadStart() 
{ 
     try 
     { 
      ThreadImplementation();   
     } 
     catch (Exception e) 
     { 
      mainForm.BeginInvoke(OnBackgroundThreadException, e); 
     } 
} 

này sẽ đảm bảo bạn nhận được một tin nhắn trên chủ đề chính của ứng dụng bất cứ khi nào các chủ đề hiện một bất thường tắt. Bạn không cần phải thăm dò ý kiến ​​bất cứ điều gì. BackgroundWorker thường hữu ích khi bạn cần nói chuyện ngược lại với chuỗi giao diện người dùng không đồng bộ. (I.E. cập nhật tiến độ).

+0

Nhưng tôi cần một tham chiếu đến một điều khiển - chỉ dành cho purpuse này:/ – tanascius

+0

Một kiểm soát là một cách thuận tiện để thực thi mã trên chuỗi giao diện người dùng. Không phải là cách duy nhất. Thông thường bạn cần phải chuyển trở lại tại một số điểm, tôi có xu hướng thích càng sớm càng tốt. –

2

Vào cuối xử lý ngoại lệ của thread của bạn, gọi một phương thức callback về chủ đề chính của bạn và khởi động lại người lao động:

public delegate void AbnormalExitDelegate(object errorArgs); 

class Boss 
{ 
    Worker worker; 
    void Start() 
    { 
     worker = new Worker(); 
     worker.AbnormalExitCallback = new AbnormalExitDelegate(AbnormalExit); 
     Thread workerThread = new Thread(worker.DoWork); 
     workerThread.Start(); 
    } 
    public void AbnormalExit(object errorArgs) 
    { 
     Start(); 
    } 
} 
class Worker 
{ 
    public AbnormalExitDelegate AbnormalExitCallback; 
    public void DoWork() 
    { 
     try 
     { 
      // do work here 
     } 
     catch (Exception ex) 
     { 
      // pass stuff back, like the exception 
      AbnormalExitCallback(ex); 
     } 
    } 
} 
Các vấn đề liên quan