2013-04-12 2 views
1

// Это мой кодОшибка при использовании BackgroundWorker

private void btnGenSumm_Click(object sender, EventArgs e) 
{ 
    if (backgroundWorker1.IsBusy != true) 
    { 
     btnGenSumm.Enabled = false; 
     btnExpSum.Enabled = false; 
     btnClose.Enabled = false; 
     pBox1.Visible = true; 
     backgroundWorker1.RunWorkerAsync(); 
    } 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
     BackgroundWorker worker = sender as BackgroundWorker; 
     loadSummSales(); // this is the process 
     System.Threading.Thread.Sleep(50); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, 
    RunWorkerCompletedEventArgs e) 
{ 
     pBox1.Visible = false; 
} 

Там нет ошибки в выполнении процесса на первом щелчке, но еще раз, когда я пытаюсь нажать кнопку управления (btnGenSumm), чтобы повторить процесс, я получил ошибку "значение dispose не может быть вызвано при создании handhandle"., Пожалуйста, помогите мне с этим.

+0

* Где * вы получите исключение? (Кроме того, приложите больше усилий для форматирования вашего вопроса - ваш код повсюду.) –

+0

protected override void Dispose (bool disposing) { if (disposing && (components! = Null)) { components.Dispose(); } base.Dispose (распоряжение); } –

+0

Я думаю, что проблема не с Фоновым работником, это может быть проблема внутри вашей логики loadSummSales(). для проверки комментария loadSummSales() и попробуйте – Lingaraj

ответ

0

Я всегда создавал нового работника перед началом задания; это позволяет избежать этих проблем.

private void btnGenSumm_Click(object sender, EventArgs e) 
{ 
    // WorkerFactory creates your worker and hooks up the DoWork 
    // and RunWorkerCompleted events 
    var backgroundWorker1 = WorkerFactory(); 

    // ... 
    // Disable access to this Click event in the UI here 

    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_RunWorkerCompleted(
    object sender, 
    RunWorkerCompletedEventArgs e) 
{ 
    // Re-enable access to the Click event in the UI here 
} 

Используя этот подход, нет никакого способа, которым работник никогда не могут быть доступны в то время как он работает, и вы гарантированно, что всякий раз, когда пользователь нажимает на кнопку, как последний работник заполнил и не противный IsBusy выдумки.

UPDATE

Явное WorkerFactory делает что-то вроде этого

private BackgroundWorker WorkerFactory() 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += backgroundWorker1_DoWork; 
    worker.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; 

    return worker; 
} 
+0

WorkerFactory(); , Я получил ошибку здесь –

+0

См. Обновление выше. – briantyler

Смежные вопросы