Я использую поток BackgroundWorker для выполнения длинной задачи (в основном, чтение большого XML-файла). В первый раз работник работает отлично по своему желанию, но если я загружу второй файл xml, используя тот же фоновый рабочий, он отлично работает, но большую часть времени RunWorkerCompleted Backgroundworker запускается даже до события DoWork. Некоторая часть кода отображается нижеСобытие RunWorker рабочего стола завершено даже до завершения работы
private void openFile_Click(object sender, RoutedEventArgs e)
{
// Code removed for brevity
worker = new BackgroundWorker();
worker.RunWorkerAsync();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.WorkerReportsProgress = true;
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DataImport();
//worker.Dispose();
//worker.Disposed += new EventHandler(worker_Disposed);
//worker.DoWork -= worker_DoWork;
//worker.RunWorkerCompleted -= worker_RunWorkerCompleted;
//worker = null;
//GC.Collect(GC.GetGeneration(worker), GCCollectionMode.Forced);
}
рабочий является глобально определенной переменной. Что здесь не так, я не получаю. Пожалуйста, помогите
Несколько советов для Выполнил: Не называйте 'GC.Collect () ', Проверьте' e.Error'. –
Невозможно ответить, не видя хотя бы схему DoWork(). –
Если ваша функция DoWork создает поток для выполнения своей работы, и вы не выполняете .Join(), DoWork немедленно вернется. Но, как сказал @Henk, нужно посмотреть, что делает DoWork. – bland