2008-12-08 37 views
1

我遇到以下问题:多线程WPF应用程序,Model View Presenter实现。属于一起的演示者和视图由工厂在单独的线程上创建,并应该获得单独的分派器。Multiple Dispatchers问题

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 

但我想要做的是,当上了主持人的方法是从另一个线程比在该主持人的生活,再次调用该方法,在那里他有他自己的调度员演示的线程上调用,因此我不需要在我的Presenter和视图之间的呼叫中处理Dispatcher。 这是可能的吗,我的设计是否有缺陷或有什么更好的方法来实现我想要的?

+0

我在我的博客上发布了一个解决方案,位于http://www.philippbraun.net/2008/12/handling-multiple-dispatchers-in-wpf.html – 2008-12-28 15:54:42

回答

2

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

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

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