2010-11-18 20 views
9

Tôi có một ứng dụng GUI cần chạy các phép tính dài (suy nghĩ một phút hoặc hơn) và cách mà nó đề cập đến điều này là bằng cách tính toán cho một nhân viên nền. (phần này là tốt)chủ đề nào mà trình xử lý sự kiện hoàn thành chạy trên?

Câu hỏi tôi có là nếu tôi làm điều gì đó như: this.backgroundWorker.RunWorkerCompleted + = new System.ComponentModel.RunWorkerCompletedEventHandler (this.doSomethingElse);

is doSomethingElse sẽ được chạy trên luồng giao diện người dùng chính hoặc bất kỳ thứ gì trong nhóm chủ đề mà nhân viên nền đã chạy?

cảm ơn sự giúp đỡ nào bạn có thể cung cấp.

+1

Bạn có thể viết các 'System.Threading.Thread.CurrentThread.ManagedThreadId' vào cửa sổ đầu ra trong 'UI',' DoWork' và' WorkCompleted' để xác nhận – PostMan

Trả lời

6

Nó sẽ được chạy trong cùng một luồng mà BackgroundWorker đang ở, nghĩa là thường là chuỗi giao diện người dùng.

+0

Ok để phần thứ hai, nhưng một Bgw (hoặc bất kỳ đối tượng nào khác) không phải là 'trong một chủ đề'. –

+1

Xin lỗi, các chủ đề mà sinh ra nó sẽ là một từ ngữ tốt hơn – Homde

+0

Điều này sẽ trả về một điểm thú vị thực sự .. nếu bạn sử dụng trình thiết kế GUI trực quan trong một ứng dụng biểu mẫu cửa sổ để khai báo một BackgroundWorker, thì đối tượng BackgroundWorker thực tế có kết thúc trên ngăn xếp cho chuỗi giao diện người dùng hoặc trên heap? –

5

là doSomethingElse sẽ được chạy trên thread UI chính

Vâng, đó là lý do chính của việc cho một BackgroundWorker. Nó có 3 sự kiện, chỉ DoWork sẽ được thực hiện trên một thread riêng biệt (ThreadPool). Đã hoàn thành và ProgressChanged sẽ được sắp xếp theo chủ đề 'chính'.

4

Nếu BackgroundWorker được tạo từ chuỗi giao diện người dùng, thì sự kiện RunWorkerCompleted cũng sẽ được nâng lên trên chuỗi giao diện người dùng.

Nếu được tạo từ chuỗi nền, sự kiện sẽ được nâng lên trên chuỗi nền chưa xác định.

Xem bài đăng này và sự cố kết nối này để biết thêm thông tin.

https://stackoverflow.com/a/2806824/279999

http://connect.microsoft.com/VisualStudio/feedback/details/116930/backgroundworker-components-progresschanged-and-runworkercompleted-event-run-on-wrong-thread

+0

Thật vậy! Lần đầu tiên tôi đã nhầm lẫn thực tế này khi ứng dụng của tôi hoạt động tốt và sự kiện đã hoàn thành được gọi từ chuỗi giao diện người dùng chính. Nhưng các bài kiểm tra đơn vị của tôi thất bại trong trường hợp hoàn thành sự kiện được gọi từ chủ đề nền, không phải từ chủ đề kiểm tra chính –

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