Ошибка CrossThread с параллельным классом - ProgressBar - PullRequest
0 голосов
/ 30 ноября 2011

Я выполняю много вставок и хочу добавить индикатор выполнения.Используя Parallel ForEach, я получаю следующую ошибку:

"Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException"

progressbar1 - исключение уровня типа 'Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException

private void button1_Click(object sender, EventArgs e)
{
    textBox4.Text = richTextBox1.Lines.Length.ToString(); 
    DateTime start = DateTime.Now;
    TimeSpan timediff = new TimeSpan();

    progressBar1.Maximum = i;
    progressBar1.Minimum = 0;
    progressBar1.Step = 1;

    int j = 1;
    l = 0;
    k=0;
    Parallel.ForEach(richTextBox1.Lines, (line) =>
    {
        progressBar1.Value = j;
        try
        {
            string pwd = query.Querie_read("select plain from rainbow where plain='" + line.ToString() + "'");
            if (pwd != line.ToString())
            {
                fct.AddRainbow(line.ToString());
                k++;
            }
            else
            {
                l++;
            }
        }
        catch (Exception ex)
        {
            // MessageBox.Show(ex.Message);
            l++;
        }

        j++;

    });
    textBox1.Text = k.ToString();
    textBox3.Text = l.ToString();
    timediff = DateTime.Now.Subtract(start);
    textBox2.Text = timediff.ToString();

    MessageBox.Show("Finished");
}

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Пользовательский интерфейс может быть обновлен только из основного потока (или, точнее, из потока, который создал пользовательский интерфейс).Чтобы выполнить код в нужном потоке, используйте диспетчер:

Для WPF:

this.Dispatcher.BeginInvoke(new Action(() => progressBar1.Value = j));

Для WinForm:

this.BeginInvoke(new Action(() => progressBar1.Value = j));
0 голосов
/ 30 ноября 2011
progressBar1.Invoke((MethodInvoker)(delegate() { progressBar1.Value = j; }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...