2012-03-16 121 views
2

我将使用InvokeRequired到C#WPF为什么InvokeRequired和Dispatcher.CheckAccess的布尔值颠倒了?

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

的VB代码返回一个VB窗体代码 “苹果

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

但我的C#代码返回 “

是不是C#的CheckAccess与VB Formc的InvokeRequired相同?为什么布尔值被倒置?

+1

的WPF家伙没聊到的WinForms家伙需要。 – 2012-03-16 12:38:55

回答

4

Dispatcher.CheckAccess()检查您是否与线程关联,在我们的情况下它的错误。

InvokeRequired检查您是否需要与该线程关联,在我们的情况下为真。

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

InvokeRequired = !Dispatcher.CheckAccess() 

调用是,如果你没有访问特定线程

+0

这不是回答这个问题,还是我以某种方式误解了它? – maka 2012-03-19 09:49:29

1

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

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

NB。 C#有InvokeRequired属性Windows.Forms

+0

当线程无法访问主UI线程时CheckAccess为false,并且线程无法访问主UI线程并且需要Invoke时InvokeRequired为true。所以CheckAccess和InvokeRequired的布尔值确实相反? MSDN真的让我困惑...... – KMC 2012-03-16 10:34:51

+0

这是WPF我转换为.. – KMC 2012-03-16 10:35:51

+0

那么,你总是可以创建一个名为'InvokeRequired'的属性,它调用'CheckAccess()'函数并将结果颠倒过来! – Nick 2012-03-16 11:32:30

相关问题