от
Привязка данных в C#, поток, который изменяет данные приводит управление тоже меняется. Но если этот поток не тот, в котором элемент управления был создан, вы получите незаконного пересечения резьбы исключением операции. Есть в любом случае, чтобы предотвратить это?

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

5 Ответы

0 голосов
от
Привязка данных в C#, поток, который изменяет данные приводит управление тоже меняется. Но если этот поток не тот, в котором элемент управления был создан, вы получите незаконного пересечения резьбы исключением операции. Есть в любом случае, чтобы предотвратить это?
0 голосов
от
Вы должны быть в состоянии сделать что-то вроде:
if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}
Свойство invokerequired-это свойство элементов управления, чтобы увидеть, если вы находитесь на нужной ветке, то ссылаться будет вызывать делегат на правильную нить. Обновление: на самом деле, на моей прошлой работе мы делали что-то вроде этого:
private void SomeEventHandler(Object someParam)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
    }

    // Regular handling code
}
которая устраняет необходимость в блок else, и немного подкручивает код.
0 голосов
от
А у меня нет теста, чтобы перейти от Я не могу гарантировать, что это решение, но мне кажется, что сценарий, аналогичный тому, который используется для обновления индикатора выполнения в разных потоках (использовать делегат) будет уместен.
public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);

public void DoDataBind()
{
    DataBind();
}
Если привязка данных должно быть сделано по конкретной теме, то давайте что нить делать работу!
0 голосов
от
Если поток вызовов является "незаконным" (т. е. вызова databind влияет на элементы управления, которые были созданы не в теме он вызывается), то вам нужно создать делегат, так что даже если решение / подготовка к привязку не сделали в контрольно-создания потока, любой полученный внесении изменений в них (т. е. метод databind()) будет. Вы могли бы назвать мой код рабочего потока, например:
this.BindData.Invoke();
Это порождало оригинальный поток, чтобы сделать привязку, которая (предположим, что это поток, который создал элементы) должны работать.
0 голосов
от
В WPF и Silverlight привязка инфраструктуры заботится о переключении на поток пользовательского интерфейса.
...