我有以下问题:多线程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。 这有可能吗,我的设计有缺陷还是有更好的方法来达到我的目的?
答案 0 :(得分:2)
问题是Dispatcher在新线程上没有实例化DispatcherObject时没有启动,但如果您实例化一个虚拟对象然后调用您的演示者的方法,则调度程序将正常运行。例如
private void ThreadStartingPoint()
{
var dummyDispatcherObject = new Style();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(CreatePresenterInternal));
Dispatcher.Run();
}
我可以在blog上找到完整的解决方案。