Проблема с фоновым рабочим - PullRequest
0 голосов
/ 17 декабря 2009

Скажите, что у меня есть следующий класс / Форма (полупсевдо):

public partial class X : Form
{
    private DataTable dt;
    private BackgroundWorker bg;

    public X()
    {
        dt.Columns.Add("A");
        dt.Columns.Add("B");
        dt.Columns.Add("C"); 
    }

    private void button_Click(...)
    {
        bg = new BackgroundWorker();  
        bg.DoWork += new DoWorkEventHandler(bg_DoWork);
        bg.RunWorkerAsync();
    }

    private void bg_DoWork(...)
    {
        // do some stuff  
        MagicMethod(parameters);

        // doesnt work, how to fix this?
        dataGridView1.Invoke((Action)delegate { dataGridView1.DataSource = dt; });
    }

    private void MagicMethod(params)
    {
        // update a label, WORKS 
        label1.Invoke((Action) delegate { label1.Text = "somestuff" }

        // do some stuff to fill the datatable
    } 
}

Конечно, это дистиллированная версия, без BackgroundWorker все нормально, но так как я хочу более отзывчивый пользовательский интерфейс, я пытаюсь реализовать его. Но сетка не обновляется работником (тогда как метка работает правильно). Любые советы?

1 Ответ

1 голос
/ 17 декабря 2009

Вы вполне можете вызывать исключение где-то (возможно, внутри MagicMethod), и, поскольку вы не обрабатываете событие Bgw RunWorkerCompleted, вы не замечаете его.

Итак, добавьте событие RunWorkerCompleted и проверьте, если e.Error != null

Завершенное мероприятие также является удобным и безопасным местом для обработки результатов: dataGridView1.DataSource = dt;

См. этот пример MSDN и обратите внимание на шаблон if / else if / else в событии RunWorkerCompleted.

...