Tôi có thể xác định nhân viên nền trong một phương pháp không?Nhân viên nền và thu gom rác thải?
private void DownLoadFile(string fileLocation){
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler((obj, args) => {
// Will be executed by back ground thread asynchronously.
args.Result = Download(fileLocation);
});
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((obj, args) => {
// will be executed in the main thread.
Result r = args.Result as Result;
ReportResult(r);
});
worker.RunWorkerAsync(fileLocation);
}
Câu hỏi: Nếu Tải về() chức năng mất nhiều thời gian để tải về các tập tin, GC có thể kick vào và thu thập đối tượng người lao động trước khi RunWorkerCompleted() được thực thi?
Tôi khuyên bạn nên sử dụng đại biểu (Hành động (Chuỗi) sẽ thực hiện) và sau đó gọi BeginInvoke. Tôi không thấy bất kỳ nhu cầu nào cho BackgroundWorker trong mã này. Bạn vẫn có thể đính kèm một sự kiện khi phương thức được thực hiện. – JDB
Cách tốt hơn để thực hiện việc này là thêm nó vào hàng đợi của luồng chủ đề bằng cách sử dụng 'QueueUserWorkItem': http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx –
@J ... Các threadpool là tốt đẹp, nhưng nó làm cho việc xử lý gọi lại * trên bên phải SynchronizationContext * khó khăn hơn. TPL xử lý độc đáo, mặc dù. –