Czy można zdefiniować pracownika tła w metodzie?Pracownik w tle i wywóz śmieci?
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);
}
Pytanie: W przypadku pobierania function() zajmuje dużo czasu, aby pobrać plik, może GC kopać i zbierać obiekt pracownika przed RunWorkerCompleted() jest wykonywana?
Polecam używanie delegata (działanie (z ciągów)), a następnie wywołanie BeginInvoke. Nie widzę potrzeby korzystania z BackgroundWorker w tym kodzie. Nadal można dołączyć wydarzenie, gdy metoda zostanie wykonana. – JDB
Lepszym sposobem na to byłoby dodanie go do kolejki puli wątków za pomocą 'QueueUserWorkItem': http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx –
@J ... Pula wątków jest przyjemna, ale sprawia, że obsługa wywołania zwrotnego * z właściwego kontekstu synchronizacji * jest trudniejsza. Jednak TPL ładnie to obsługuje. –