多个Dispatchers问题

时间:2008-12-08 08:42:00

标签: .net wpf vb.net multithreading

我有以下问题:多线程WPF应用程序,模型视图Presenter实现。属于一起的演示者和视图由工厂在单独的线程上创建,并且应该获得单独的Dispatcher。

Public Function CreatePresenter(Of T As {New, Class})(ByVal p_eCreationOptions As eViewCreationOptions) As T Implements IPresenterFactory.CreatePresenter

    Select Case p_eCreationOptions
        Case eViewCreationOptions.CreateInCallingThread
            CreatePresenter(Of T)()
        Case eViewCreationOptions.CreateInNewThread
            Dim oThread As New Thread(New ThreadStart(AddressOf CreatePresenter(Of T)))
            oThread.SetApartmentState(System.Threading.ApartmentState.STA)
            oThread.Start()
            oThread.Join()
        Case Else
            Throw New InvalidOperationException("Need to specify creation options.")
    End Select

    Return CType(m_oCreatedPresenter, T)

End Function

Private Sub CreatePresenter(Of T As {New, Class})()
    m_oCreatedPresenter = Activator.CreateInstance(Of T)()
End Sub

问题是,现在演示者是在另一个线程上创建的,并且线程在创建后处于休眠状态,但是那里的调度程序还没有运行。现在,如果我来自应用程序所在的主UI线程并调用我的演示者,我创建视图,显示它,现在只有我可以调用Dispatcher.Run()。

Public Overloads Sub Show()
    Console.WriteLine ("Show Caller ThreadID = " & Thread.CurrentThread.ManagedThreadId)
    MyBase.Show()
    System.Windows.Threading.Dispatcher.Run()
End Sub

但我想要做的是,当演示者的一个方法从另一个线程调用而不是演示者所在的位置时,再次在演示者的线程上调用该方法,在那里他有自己的Dispatcher,这样我就不会我需要在我的Presenter和视图之间的呼叫上处理Dispatcher。 这有可能吗,我的设计有缺陷还是有更好的方法来达到我的目的?

1 个答案:

答案 0 :(得分:2)

问题是Dispatcher在新线程上没有实例化DispatcherObject时没有启动,但如果您实例化一个虚拟对象然后调用您的演示者的方法,则调度程序将正常运行。例如

 private void ThreadStartingPoint()  
 {  
     var dummyDispatcherObject = new Style();  
     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(CreatePresenterInternal));  
     Dispatcher.Run();  
}  

我可以在blog上找到完整的解决方案。