Tôi cần phải thực hiện RunWorkerAsync()
trả lại List<FileInfo>
. Làm thế nào tôi có thể trả về một đối tượng từ một nhân viên nền?Cách làm cho BackgroundWorker trả về một đối tượng
Trả lời
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.
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
.
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;
}
}
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...
}
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());
}
Bahhh cảm ơn bạn! – ganjeii
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
- 1. JavaScript: hàm trả về một đối tượng
- 2. Trả về một đối tượng trong C++
- 3. đối tượng trả về chung
- 4. jQuery.getJSON và jQuery.parseJSON trả về [đối tượng đối tượng]?
- 5. Trả về nhiều đối tượng trong một hàm R
- 6. Trả về đối tượng từ hàm
- 7. Trả về đối tượng từ CursorAdapter.get()
- 8. Tạo một đối tượng nullable qua Activator.CreateInstance trả về null
- 9. HttpSession trả về đối tượng rỗng cho SPRING_SECURITY_CONTEXT
- 10. Làm cách nào để buộc Powershell trả về mảng khi cuộc gọi chỉ trả về một đối tượng?
- 11. lực trả về đối tượng được gán
- 12. Làm cách nào để trả về một mảng chuỗi từ đối tượng ActiveX sang JScript
- 13. C++ - hàm trả về đối tượng
- 14. Tại sao ISerializationSurrogate.SetObject trả về một đối tượng cũng như lấy một đối tượng để điền?
- 15. Có thể một assembly C++ được quản lý trả về một đối tượng cho C# không?
- 16. Cách đối tượng Object trả về Strings? (Java)
- 17. Tại sao Get-Date dường như trả về đối tượng DateTime, nhưng BinarySerializer cho biết nó trả về một PSObject?
- 18. Làm thế nào để trả về một đối tượng lớp bằng cách tham chiếu trong C++?
- 19. C#: Trả về một đại biểu cho một đối tượng và tên phương thức
- 20. Làm cách nào để LINQ trả về đối tượng có giá trị lớn nhất cho một thuộc tính nhất định?
- 21. Custom eclipse template để làm cho setter trả về đối tượng này?
- 22. Hàm Javascript không trả về đối tượng khi có ngắt dòng giữa câu lệnh trả về và đối tượng?
- 23. Làm thế nào để bạn trả về một giá trị mặc định nếu một LINQ cho các đối tượng truy vấn trả về không có giá trị
- 24. phpdoc - xác định biến đối tượng trả về cho một phương thức
- 25. Trả về đối tượng JSON từ trang ASP.NET
- 26. Không thể trả về đối tượng lớp với Mockito
- 27. chr() tương đương trả về đối tượng byte, trong py3k
- 28. Tại sao loại của javascript luôn trả về "đối tượng"?
- 29. Việc truyền một đối tượng trong C# luôn trả về một tham chiếu đến đối tượng ban đầu
- 30. Chức năng trả về một đối tượng có loại được chỉ định trong đối số
Có sự khác biệt giữa chờ đợi và _locking lên UI_ trong khi làm như vậy. –
@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. –
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. –