Фоновый рабочий вешает все приложение - PullRequest
0 голосов
/ 07 октября 2011

Хорошо, вот довольно светлый код:

// 
// numConfigsBindingSource
// 
this.numConfigsBindingSource.DataMember = "NumConfigs";
this.numConfigsBindingSource.DataSource = this.DSNumConfigs;

// Grid
this.GridNumConfigs.DataSource = this.numConfigsBindingSource;

// 
// DSNumConfigs
// 
this.DSNumConfigs.DataSetName = "DSNumConfigs";
this.DSNumConfigs.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
// 
// numConfigsTableAdapter
// 
this.numConfigsTableAdapter.ClearBeforeFill = false;
//
// 
// DSConfigNumbers
// 
this.DSConfigNumbers.DataSetName = "DSConfigNumbers";
this.DSConfigNumbers.EnforceConstraints = false;
this.DSConfigNumbers.SchemaSerializationMode =       System.Data.SchemaSerializationMode.IncludeSchema;

private void Form1_Load(object sender, EventArgs e)
{                
    worker.RunWorkerAsync();
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    this.numConfigsTableAdapter.Fill(this.DSNumConfigs.NumConfigs);                    
}

Затем я запускаю этот код под VS2010, он работает и находит, но когда я просто запускаю релиз-приложение, оно зависает. Но если я переписываю этот код, который не использует BackgroundWorkers, он работает нормально. Нужно ли мне приложить некоторые усилия, чтобы четко выпустить фонового работника? Я попытался заблокировать рабочий класс в Form1_Load, он не дает никакого успеха. Также пытались заблокировать this.DSNumConfigs в DoWork, а также никаких успешных вещей.

1 Ответ

1 голос
/ 07 октября 2011

Что ж, вы делаете что-то небезопасное: вы получаете доступ к пользовательскому интерфейсу в потоке без пользовательского интерфейса. Вы не делаете это явно , но ваш пользовательский интерфейс привязан к вашему табличному адаптеру.

Вы можете отменить привязку, , затем запустить фоновый рабочий, а затем (по завершенному событию) повторно связать пользовательский интерфейс.

Я удивлен, что это не вызывает исключения, когда вы запускаете его в отладчике, если честно ...

...