Сведения о вопросе

SOON

16:03, 1st July, 2020

Теги

c#   data-binding    

Любое решение для незаконного исключения операции перекрестного потока?

Просмотров: 466   Ответов: 4

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

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



  Сведения об ответе

VCe znayu

18:03, 1st July, 2020

Вы должны быть в состоянии сделать что-то вроде:

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

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

UPDATE: вообще - то, на моей последней работе мы делали нечто подобное:

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

    // Regular handling code
}

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


  Сведения об ответе

VERSUION

18:03, 1st July, 2020

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

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

public void DoDataBind()
{
    DataBind();
}

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


  Сведения об ответе

прога

18:03, 1st July, 2020

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

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

this.BindData.Invoke();

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


  Сведения об ответе

DINO

18:03, 1st July, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться