Ответ 1
Учитывая, что вы фактически не используете большую часть функций BackgroundWorker, я бы рекомендовал вместо этого использовать TPL:
private void DownLoadFile(string fileLocation)
{
Task.Factory.StartNew( () => Download(fileLocation))
.ContinueWith(t => ReportResult(t.Result), TaskScheduler.FromCurrentSynchronizationContext());
}
При этом объект worker
не будет собирать мусор после его запуска, так как поток ThreadPool сам будет содержать рабочего как "использованный объект". Сборщик мусора не сможет его собирать до тех пор, пока не исполнится обработчик события завершения, и в этот момент не будет кода пользователя, который мог бы достигнуть экземпляра BackgroundWorker
.
Кроме того, скорее всего, экземпляр этого класса не будет собран из мусора, поскольку методы экземпляра (ReportResults
), используемые закрытием, сохраняют экземпляр "this" доступным и не пригодным для GC.