Tôi đang làm việc với các thành phần sau:BackgroundWorker xử lý ngoại lệ
- một thư viện (mà ném một ngoại lệ)
- một thử nghiệm giao diện điều khiển để kiểm tra đăng nhập của tôi
- thư viện doanh nghiệp khối ứng dụng xử lý ngoại lệ
- khối ứng dụng ghi nhật ký thư viện doanh nghiệp
Tôi đang gọi phương thức thư viện bằng cách sử dụng một người làm việc nền. Thư viện ném ngoại lệ nhưng trình xử lý RunWorkerCompleted không bao giờ được gọi.
Cách duy nhất để bắt ngoại lệ là bao quanh mã trình xử lý DoWork của tôi bằng khối try/catch.
Đã hiểu sai thuộc tính RunWorkerCompletedEventArgs.Error chưa? Không phải là nó để nhận được ngoại lệ đã bị bắt bởi BackgroundWorker?
Codesample:
static BackgroundWorker w = new BackgroundWorker();
w.DoWork += new DoWorkEventHandler(w_DoWork);
w.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(w_RunWorkerCompleted);
w.RunWorkerAsync();
static void w_DoWork(object sender, DoWorkEventArgs e)
{
MyClass m = new MyClass();
w.result = m.Compute();
}
static void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
HandleException(e.Error);
}
/* result related code */
}
static void HandleException(Exception e)
{
ExceptionPolicy.HandleException(e, "MyPolicy");
}
Các ví dụ trên dẫn đến một kết thúc ứng dụng giao diện điều khiển của tôi. Đầu ra vs2010 hoàn toàn không viết gì (chỉ có đầu ra mặc định).
Vậy vấn đề ở đâu?
// Chỉnh sửa: đoạn mã này hoạt động để bắt ngoại lệ của thư viện.
static void w_DoWork(object sender, DoWorkEventArgs e)
{
try
{
MyClass m = new MyClass();
w.result = m.Compute();
}catch(Exception e){ }
}
Bạn có thứ gì đó trên chủ đề chính ngăn không cho nó kết thúc? Một cái gì đó giống như một thời gian (đúng)? – dcarneiro
Bạn có chắc chắn 100% rằng RunWorkerCompleted không bao giờ được gọi? Đây là một câu hỏi SO chứng minh điều này sẽ làm việc ... http: //stackoverflow.com/questions/1044460/unhandled-exceptions-in-backgroundworker –
bạn không thể gỡ lỗi và xem những gì sẽ xảy ra? những gì HandleException() trả về? – Reniuz