Любое решение для исключения Illegal Cross Thread Operation?

При привязке данных в C# поток, изменяющий данные, также вызывает изменение элемента управления. Но если этот поток не тот, в котором был создан элемент управления, вы получите исключение Illegal Cross Thread Operation.

Есть ли способ предотвратить это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
4 341
4

Ответы 4

Вы должны уметь делать что-то вроде:

if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}

InvokeRequired - это свойство в элементах управления, чтобы увидеть, находитесь ли вы в правильном потоке, тогда Invoke вызовет делегат в правильном потоке.

ОБНОВЛЕНИЕ: Собственно, на моей последней работе мы сделали что-то вроде этого:

private void SomeEventHandler(Object someParam)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
    }

    // Regular handling code
}

что устраняет необходимость в блоке else и как бы ужесточает код.

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

public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);

public void DoDataBind()
{
    DataBind();
}

Если привязка данных должна выполняться определенным потоком, позвольте этому потоку выполнять работу!

Если вызов потока является «незаконным» (то есть вызов DataBind влияет на элементы управления, которые не были созданы в потоке, из которого он вызывается), вам необходимо создать делегат, чтобы даже если решение / подготовка для DataBind не выполнялись в поток, создающий элемент управления, любая их результирующая модификация (например, DataBind ()) будет.

Вы бы вызывали мой код из рабочего потока следующим образом:

this.BindData.Invoke();

Это приведет к тому, что исходный поток выполнит привязку, которая (при условии, что это поток, создавший элементы управления) должен работать.

В WPF и Silverlight инфраструктура привязки обеспечивает переключение на поток пользовательского интерфейса.

Другие вопросы по теме

Ошибка привязки данных WinForms ComboBox
Почему контекст данных контекстного меню имеет значение null при первом открытии, но то, что ожидается при следующем открытии в WPF?
Авалония – изменение DataTemplate на основе значений коллекции вызывает исключение ArgumentOutOfRangeException
Как сделать WPF DataGridColumn связанным, редактируемым ComboBox, в котором изменения элементов распространяются на другие строки?
Отправка данных Excel из VBA в C# для привязки WPF в реальном времени
Невозможно получить доступ к наблюдаемому свойству в модели представления из соответствующего файла .xaml представления — .NET MAUI MVVM
Я не понимаю сообщение об ошибке «Привязка не может быть изменена после ее использования»
WPF Multibiding, как ввести ElementName, когда целевой элемент находится в другом пользовательском элементе управления
Как реализовать TextChanged в CommunityToolkit MVVM-способе
Привязка текста заголовка в пользовательском шаблоне заголовка