решаемые
Кажется, что Оливер прав. После нескольких попыток я получил исключение, и в режиме отладки я получаю это точно. Так что это должно быть все время. Вы также должны проверить ответ Мэтью Ваттонса;)
Пример
Прежде всего небольшой пример, который объяснит мое замешательство.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace testCrossThreading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Thread(ThreadJob).Start();
}
void ThreadJob()
{
//label1.Text = "1";
changeText(label1, "1");
}
void changeText(Label L, String message)
{
L.Text = message;
}
}
}
Вопрос
Итак, теперь мой вопрос: если я раскомментирую label1.Text = "1";
в функции "ThreadJob", тогда я получаю исключение перекрестного потока, как ожидалось.
Но если я оставлю его прокомментированным, как показано на примере, он действительно работает. Но почему?
Функция вызывается вспомогательным потоком, и я ничего не вызываю. Таким образом, это все еще вспомогательный поток, а не поток GUI, который изменяет текст метки imo. Или я что-то упускаю?
Я бы написал это так.
void ThreadJob()
{
Action a = () => label1.Text = "1";
this.Invoke(a);
}