2009-03-20 42 views
5

Tôi đã đấu tranh với xử lý sự kiện trong chủ đề nền.Xử lý sự kiện nền công nhân

Tất cả tài liệu tôi gặp phải khiến tôi tin rằng khi trình xử lý sự kiện DoWork ném ngoại lệ, ngoại lệ phải được xử lý trong trình xử lý RunWorkerCompleted và ngoại lệ đó sẽ có sẵn trong thuộc tính Lỗi của RunWorkerCompletedEventArgs.

Điều này là tốt, nhưng trong suốt thời gian gỡ lỗi, tôi luôn thấy một ngoại lệ bị giải mã bởi thông báo mã người dùng. Điều này làm cho tôi tin rằng có một vấn đề với cách tiếp cận của tôi.

Tôi nên thực hiện các bước nào để giải quyết vấn đề này?

Kính trọng, Jonathan

Trả lời

2

Tôi đã nhìn thấy hành vi này trước đây, và tôi đã nhận được xung quanh nó bằng cách trang trí handler DoWork với System.Diagnostics.DebuggerNonUserCode thuộc tính:

[System.Diagnostics.DebuggerNonUserCode] 
void bw_DoWork(object sender, DoWorkEventArgs e) 
{ ... } 

Note bạn sẽ chỉ thấy điều này nếu bạn đang chạy trong trình gỡ lỗi; thậm chí không có thuộc tính, tất cả cũng giống như khi chạy từ trình bao.

Tôi đã xem lại điều này một lần nữa và tôi vẫn không thể thấy bất kỳ lý do chính đáng nào khiến bạn cần thực hiện việc này. Tôi đang gọi nó là một trình gỡ rối.

+0

Tại sao bạn cần thực hiện việc này? Bởi vì đó là cách BackgroundWorker hoạt động. Dễ dàng hơn nhiều trong việc xử lý lỗi trong chuỗi cuộc gọi hơn là trong chuỗi làm việc. Nhưng khi gỡ lỗi, cách khác là đúng vì bạn có quyền truy cập vào tất cả các biến cục bộ. – Samuel

+0

Tôi không nghĩ "đó là cách làm việc của BackgroundWorker" là một câu trả lời thỏa mãn. Nghe có vẻ như bạn thấy tất cả các ngoại lệ như chỉ dẫn của các lỗi mã hóa - đó là sự thật chỉ đôi khi. Nếu tôi muốn trình gỡ rối phá vỡ một ngoại lệ được xử lý, tôi sẽ bật các ngoại lệ đầu tiên hoặc thiết lập một điểm ngắt. –

0

Cách tiếp cận của bạn là chính xác. Chỉ cần nhấn tiếp tục trên tin nhắn và tiếp tục. Nếu nghi ngờ, hãy thử nghiệm nó bên ngoài phiên gỡ lỗi.

1

Tôi đã gặp sự cố này trước đây. E.Error chỉ được thiết lập khi bạn không chạy trong chế độ gỡ lỗi. Nếu bạn chạy trong Debug, exectuion dừng tại vị trí của Exception. Tuy nhiên, chạy cùng một chương trình trong chế độ Không gỡ lỗi (trong VS Debug -> Bắt đầu Nếu không có Gỡ lỗi hoặc Ctrl + F5) và hộp thoại ngoại lệ khó chịu KHÔNG đi lên, và e.Error sẽ là ngoại lệ. Bạn không chắc chắn lý do tại sao, nhưng đó là cách nó hoạt động ....

Các vấn đề liên quan