2009-06-02 40 views

Trả lời

0

Tùy thuộc vào kiểu máy của bạn, bạn có muốn gọi lại cho người tạo (hoặc một số quy trình khác) khi hoàn thành công việc hoặc bạn phải thăm dò ý kiến ​​của người lao động thường xuyên để xem và nếu có, hãy lấy kết quả.

Ý tưởng đợi một chuỗi công nhân trả về kết quả của nó làm suy yếu lợi ích của đa luồng.

1

RunWorkerAsync() bắt đầu quá trình không đồng bộ và sẽ trả về và tiếp tục thực thi mã của bạn trước khi quá trình thực sự hoàn tất. Nếu bạn muốn có được kết quả của BackgroundWorker, bạn sẽ cần phải tạo một biến mẫu để giữ giá trị đó và kiểm tra nó khi hoàn tất BackgroundWorker.

Nếu bạn muốn đợi cho đến khi hoàn thành công việc, thì bạn không cần BackgroundWorker.

+1

Có sự khác biệt giữa chờ đợi và _locking lên UI_ trong khi làm như vậy. –

+0

@TSar: Đó là sự thật, mặc dù trong bối cảnh làm việc với một thành phần cũ hơn như 'BackgroundWorker' ngữ nghĩa của" chờ đợi "là tương đối phức tạp để thực hiện (hoặc ít nhất là để chứng minh làm thế nào nó" chờ đợi "). Một cái gì đó như thế là dễ dàng hơn nhiều để thể hiện với cú pháp 'async' và 'await' bây giờ và sẽ cho phép nhà phát triển loại bỏ hầu hết các trường hợp sử dụng cho' BackgroundWorker' hoàn toàn. –

+0

Sau đó, bạn nên bổ sung câu trả lời của mình bằng các lựa chọn thay thế, thay vì chỉ yêu cầu OP không sử dụng BackgroundWorker. Khi nó đọc ngay bây giờ, có vẻ như bạn đang đề xuất không sử dụng bất kỳ loại đa luồng nào cả - và điều đó sẽ kết thúc khóa ứng dụng cho đến khi quá trình kết thúc. –

1

Bạn có thể có thread của bạn nâng cao một sự kiện với các đối tượng như một cuộc tranh cãi:

ThreadFinishedEvent(this, new ThreadEventArgs(object)); 

nơi:

public class ThreadEventArgs : EventArgs 
{ 
    public ThreadEventArgs(object object) 
    { 
     Object = object 
    } 

    public object Object 
    { 
     get; private set; 
    } 
} 
18

Tôi giả định rằng bạn không muốn chặn và chờ trên RunWorkerAsync() cho kết quả (nếu bạn đã làm, sẽ không có lý do gì để chạy không đồng bộ!

Nếu bạn muốn được thông báo khi quá trình nền kết thúc, hãy móc sự kiện RunWorkerCompleted. u muốn trả về một số trạng thái, trả về nó trong phần tử Result của sự kiện DoWork.

EDIT: Tôi gửi sớm - hoàn thành ví dụ mã của tôi

Ví dụ:

 


    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     // do your thing 
     .... 
     // return results 
     e.Result = theResultObject; 
    } 

    // now get your results 
    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     MyResultObject result = (MyResultObject)e.Result; 
     // process your result... 
    } 

 
87

Trong handler DoWork sự kiện của bạn cho BackgroundWorker (được nơi làm việc nền diễn ra) có một đối số DoWorkEventArgs. Đối tượng này có một đối tượng thuộc tính public Result. Khi nhân viên của bạn đã tạo kết quả của nó (trong trường hợp của bạn là List<FileInfo>), hãy đặt e.Result cho điều đó và trả lại.

Bây giờ, BackgroundWorker của bạn đã hoàn thành nhiệm vụ, nó kích hoạt sự kiện RunWorkerCompleted, có đối tượng RunWorkerCompletedEventArgs làm đối số. RunWorkerCompletedEventArgs.Result sẽ chứa kết quả từ số BackgroundWorker của bạn.

dụ:

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    int result = 2+2; 
    e.Result = result; 
} 

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    int result = (int)e.Result; 
    MessageBox.Show("Result received: " + result.ToString()); 
} 
+0

Bahhh cảm ơn bạn! – ganjeii

0

Nói chung khi chạy một quá trình async, Các sợi nhân nên gọi một đại biểu hoặc bắn một sự kiện (như ChrisF).

Bạn có thể kiểm tra PFX mới có chức năng đồng thời có thể trả về giá trị.

Ví dụ: có hàm Parallel.ForEach() có quá tải có thể trả về giá trị.

việc kiểm tra này ra để biết thêm

http://msdn.microsoft.com/en-us/magazine/cc817396.aspx

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