2011-09-15 4 views
6

Tôi có nhiều phương pháp (chúng chỉ chạy một lần tại một thời điểm), tất cả đều sử dụng cùng phương thức RunWorkerCompleatedProgressChanged nhưng tất cả đều có phương thức Dowork khác nhau. Có an toàn không khi thực hiện những việc sau:Điều này có an toàn để hủy đăng ký DoWork sau khi gọi RunWorkerAsync nhưng trước khi thoát khỏi chức năng?

private void button_Process_Click(object sender, EventArgs e) 
{ 
    bgWork_Process.DoWork += Scrub_DoWork; 
    bgWork_Process.RunWorkerAsync(); 
    bgWork_Process.DoWork -= Scrub_DoWork; 
} 

hoặc tôi có thể nhấn vào trường hợp cạnh này không? Tôi không nhìn thấy bất cứ điều gì trên MSDN trên nó nói rằng nó đã không được phép và nó (cho đến nay) chạy tốt trong chương trình của tôi, nhưng tôi muốn kiểm tra ở đây để xem nếu có ai đã chạy vào rắc rối làm điều này.

+0

Có nó được lưu. và phương pháp khác là chuỗi. –

Trả lời

1

gì bạn có thể làm để đảm bảo rằng các xử lý sự kiện không được loại bỏ cho đến khi bạn đang thực hiện với nó sẽ là để làm điều gì đó tương tự như

Action DoWorkAction; 

private void button_Process_Click(object sender, EventArgs e) 
{ 
    gbHistory.Enabled = false; 
    gbScrub.Enabled = false; 
    DoWorkAction = new Action(Scrub_DoWork); 
    bgWork_Process.DoWork += DoWorkAction; 
    bgWork_Process.RunWorkerAsync(); 
} 

Và trong bất cứ xử lý hoàn thành của bạn

private void bgWork_Process_CompletedHandler(object sender, EventArgs e) 
{ 
    bgWork_Process.DoWork -= DoWorkAction; 
} 

Tôi cảm thấy, tuy nhiên; có thể tốt hơn nếu chỉ cần tách riêng BackGroundWorkers cho tất cả các Hành động mà bạn cần thực hiện thay vì chia sẻ một hành động tương tự với thao tác đó hoặc bọc trong lớp để bạn có thể hiểu rõ hơn về những gì bạn đang làm.

+0

Tôi nghĩ rằng tôi sẽ kết thúc bằng cách sử dụng các công nhân nền riêng biệt như bạn đã đề xuất, nhưng tôi vẫn muốn biết rõ ràng có hoặc không về nếu những gì tôi đã làm trong OP của tôi là an toàn để làm hay không. –

+0

@ScottChamberlain Tôi khá chắc chắn rằng nó là an toàn vì cách mà mô hình sự kiện hoạt động, sự kiện được kích hoạt cho RunWorkerAsync khởi động công nhân nền đã có đại biểu cho DoWork Delegate và sau đó bạn gỡ bỏ nó sau khi có tất cả diễn ra. – msarchet

+0

Cảm ơn, nhưng khi nào và ở đâu tôi nên hủy đăng ký 'RunWorkerCompleted' trên' BackgroundWorker'? – Agent007