为什么InvokeRequired和Dispatcher.CheckAccess的布尔值被反转?

时间:2012-03-16 10:27:39

标签: c# wpf vb.net invoke dispatcher

我正在将使用InvokeRequired的VB表单代码转换为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#代码返回“ Orange

C#的CheckAccess与VB Formc的InvokeRequired不一样吗?为什么布尔值被反转?

2 个答案:

答案 0 :(得分:4)

Dispatcher.CheckAccess()检查你是否与线程相关联,在我们的例子中是假的。

InvokeRequired检查你是否需要与线程相关联,在我们的例子中是真的。

当您与特定线程无关时,您需要调用(InvokeRequired == true)。换句话说,所需调用的逻辑定义是:

InvokeRequired = !Dispatcher.CheckAccess() 

如果您无权访问特定线程

,则需要调用

答案 1 :(得分:1)

我想这是说InvokeRequired意味着您需要调用GUI线程,而CheckAccess正在检查当前线程是否可以访问GUI并且如果确实存在则返回true有权访问。

以这种方式更改命名似乎有点令人困惑。

<强> NB 即可。 C#具有InvokeRequired

Windows.Forms属性