无法从传入的MSMQ事件中获取UI线程

时间:2014-07-28 18:53:50

标签: wpf vb.net

我正在使用XAML所依赖的类:

<Window x:Class="TheWPFWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

我可以在构造函数中绘制任何内容。在该类中,我为来自MSMQ的消息进入时创建了一个处理程序:

AddHandler SomeQueue.PeekCompleted, AddressOf GetData

但是当消息通过时,我认为它与UI不同(有意义),我不能使用MSMQ消息信息在GetData()Sub中的WPF UI上绘制。

我尝试了一些Dispatcher()调用,但我得到的只是:

(at GetData) System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
   at System.Windows.Threading.DispatcherObject.VerifyAccess()
   at System.Windows.Media.Media3D.ModelVisual3D.get_Children()
   at TheWPFWindow.GetData() in C:\users\yumi\project\TheWPFWindow.xaml.vb:line 271

我知道如果我可以将对象添加到UI线程(它们在构造函数代码中工作),上述操作将起作用,但我无法弄清楚如何告诉UI线程,我甚至可能无法找到UI线程!

我知道Peek / PeekCompleted(有效)是异步的(在另一个线程上),但不应该有一种方法(在同一个类中)使用来自应用程序的图形/ UI中的传入消息线?

看起来很简单,但很难。

1 个答案:

答案 0 :(得分:0)

您需要重新调用UI线程,如下所示:

Application.Current.Dispatcher.Invoke(() =>
{
    // to do something here...
});

或在VB.Net中,我相信它会是这样的:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, New Action(Function() Do ... End Function))