我可以在方法中定義一個背景工作嗎?背景工作者和垃圾收集?
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);
}
問題:如果下載()函數需要很長的時間來下載文件,可以GC踢和RunWorkerCompleted之前收集工人對象()被執行?
我建議使用委託(Action(Of String)會做),然後調用BeginInvoke。在代碼中我看不到BackgroundWorker的任何需求。您仍然可以在方法完成時附加一個事件。 – JDB
更好的方法是使用'QueueUserWorkItem'將其添加到線程池隊列中:http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx –
@J ...線程池很好,但它確實使得在正確的SynchronizationContext *上處理回調*變得更加困難。不過,TPL可以很好地處理。 –