Поперечные ошибки

Я не могу объяснить это своими словами, поэтому вот ситуация:

myBindingSource.Add(new myElement());
SetDataSource(myBindingSource);
myBindingSource.Add(new myElement());

Я всегда ловлю исключение (исключение между потоками) при втором вызове Add. Вот пустота SetDataSource:

delegate void SetDataSourceCallback(BindingSource db);
private void SetDataSource(BindingSource db)
{
        if (myDataGridView.InvokeRequired)
        {
            SetDataSourceCallback d = new SetDataSourceCallback(SetDataSource);
            myDataGridView.Invoke(d, new object[] { db });
        }
        else
        {
            myDataGridView.DataSource = db;
        }
}

Я не могу понять, почему это происходит!

1 ответ

Решение

Используйте диспетчер основного потока пользовательского интерфейса для безопасного вызова любого кода пользовательского интерфейса из любого другого потока.

WPF не может позволить вам изменить любое состояние пользовательского интерфейса из другого потока, кроме основного потока пользовательского интерфейса. В общем, если у вас есть состояние, которое изменяет пользовательский интерфейс, вы должны заключить его в код Dispatcher.Invoke.

Application.Current.Dispatcher.Invoke(new Action(() => {
   myBindingSource.Add(new myElement());
   SetDataSource(myBindingSource);
   myBindingSource.Add(new myElement());
 }));
Другие вопросы по тегам