Почему логические значения InvokeRequired и Dispatcher.CheckAccess инвертированы? - PullRequest
2 голосов
/ 16 марта 2012

Я конвертирую код формы VB, который использует InvokeRequired в C # WPF

// VB
If Me.InvokeRequired Then
   MessageBox.Show("Apple")
Else
   MessageBox.Show("Orange")
End If

Код VB возвращает " Apple "

// C#
if (this.Dispatcher.CheckAccess())
{
   MessageBox.Show("Apple");
}
else
{
   MessageBox.Show("Orange");
}

Но мой код C # возвращает " Оранжевый "

Разве C # CheckAccess не такой же, как у VB Formc InvokeRequired? Почему логическое значение инвертировано?

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Dispatcher.CheckAccess() проверяет, связаны ли вы с потоком, в нашем случае это false.

InvokeRequired проверяет, НУЖНО ли быть связанным с потоком, в нашем случае это правда.

Вам нужно вызвать (InvokeRequired == true), когда вы не связаны с конкретным потоком.Другими словами, логическое определение требуемого вызова должно быть:

InvokeRequired = !Dispatcher.CheckAccess() 

Вызов требуется, если у вас нет доступа к конкретному потоку

1 голос
/ 16 марта 2012

Полагаю, это говорит о том, что InvokeRequired означает, что вам нужно вызвать поток GUI, тогда как CheckAccess проверяет, имеет ли текущий поток доступ к GUI и вернет ли true, если он имеет доступ.

Это немного сбивает с толку, изменяя название таким образом.

NB .C # имеет свойство InvokeRequired для Windows.Forms

...