Проблема с BackgroundWorker - PullRequest
       0

Проблема с BackgroundWorker

0 голосов
/ 04 декабря 2010

Я написал этот код для чтения тысяч строк из файлов Excel и загрузки их в DataGridView.

Но проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, какой файл я загружаю, DataGridView показывает строки только из первого файла, а список _ не очищается.

public class MyForm : Form
{
    private List<Student> _list = null;

    private void LoadFile_Click(object sender, EventArgs e)
    {
        try
        {
            if (_list != null)
            {
                _list.Clear();
            }

            openFileDialog1.ShowDialog();

            _connStr = MakeConnectionString.GetConnectionString(openFileDialog1.FileName);

            if (!string.IsNullOrEmpty(_connStr))
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }
        catch
        {
            MessageBox.Show("Application is busy with the first task!", "Busy...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
            return;
        }

        IDataReader read = StudentDA.GetReader(_connStr);
        List<Student> localList = null;

        if (_list != null)
        {
            _list.Clear();
        }
        _list = StudentMapper.GetStudents(read);


        localList = new List<Student>(_list);

        dataGridView1.Invoke(new MethodInvoker(delegate
        {
            dataGridView1.Rows.Clear();
        }));

        foreach (Student std in localList)
        {
            dataGridView1.Invoke(new MethodInvoker(delegate
            {
                dataGridView1.Rows.Add(std.SerialNo, std.RollNo);
            }));
        }
    }
}

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Вы уверены, что где-то не происходит исключение? Попробуйте обработать событие завершения и проверьте исключение, выставленное для объекта event-arg

Также; цикл с одним Invoke на каждом шаге, вероятно, замедлит процесс; может быть, выполнить выборку данных на фоновом режиме, а затем выполнить весь цикл очистки / добавления в одном Invoke. Если это слишком много, по крайней мере, разбить его на небольшие наборы; или рассмотрите виртуальный режим (который гораздо более эффективен для больших объемов данных).

1 голос
/ 04 декабря 2010

Попробуйте создавать новый объект BackgroundWorker каждый раз, когда вы загружаете новые данные.

вы не изменяете объект _connection

static _connection = null;

if(_connection == null)
  {

  }

это будет работать только в первый раз, а при следующем изменении файла это соединение не меняется.

...