单元测试中的 WPF 组件
WPF component in unit testing
我正在编写单元测试代码,出于调试目的,我确实需要查看一些数据(请不要讨论是否应该使用 UI 进行单元测试)
我创建了一个 UI 线程并像这样启动了我的组件:
System.Threading.Thread newWindowThread = new Thread(new ThreadStart(() =>
{
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(
Dispatcher.CurrentDispatcher));
plotter = new PlotterWPF();
plotter.Closed += (s, e) =>
Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
plotter.Show();
plotter.init();
System.Windows.Threading.Dispatcher.Run();
}));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.Start();
这有效并且绘图仪出现在屏幕上,我的问题是之后当我想将东西发送到绘图仪时我这样做:
public void debugFrame(Gtec2.Frame frame)
{
plotter.Dispatcher.Invoke(() =>
{
plotter.Plot(frame);
});
}
它失败了,因为绘图仪为空(在 plotter.Dispatcher...
部分)
我尝试使用 Applicaiton.Current.Dispatcher 但是 .. application.Current 为空。
我也尝试在线程外创建绘图仪,但是..我不能,因为不是 STA。我认为现在应该有办法让事情发生,我的 Dispatcher 是 newWindowThread 并且 dispatcher.Invoke 应该在那里发生但是..我不知道该怎么做..
有什么建议吗?
dispatcher = System.Windows.Threading.Dispatcher.FromThread(newWindowThread);
这将获取该特定线程的调度程序,从那里可以做到
dispatcher.Invoke(() =>
{
/*here you can access the plotter */
});
我正在编写单元测试代码,出于调试目的,我确实需要查看一些数据(请不要讨论是否应该使用 UI 进行单元测试)
我创建了一个 UI 线程并像这样启动了我的组件:
System.Threading.Thread newWindowThread = new Thread(new ThreadStart(() =>
{
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(
Dispatcher.CurrentDispatcher));
plotter = new PlotterWPF();
plotter.Closed += (s, e) =>
Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
plotter.Show();
plotter.init();
System.Windows.Threading.Dispatcher.Run();
}));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.Start();
这有效并且绘图仪出现在屏幕上,我的问题是之后当我想将东西发送到绘图仪时我这样做:
public void debugFrame(Gtec2.Frame frame)
{
plotter.Dispatcher.Invoke(() =>
{
plotter.Plot(frame);
});
}
它失败了,因为绘图仪为空(在 plotter.Dispatcher...
部分)
我尝试使用 Applicaiton.Current.Dispatcher 但是 .. application.Current 为空。
我也尝试在线程外创建绘图仪,但是..我不能,因为不是 STA。我认为现在应该有办法让事情发生,我的 Dispatcher 是 newWindowThread 并且 dispatcher.Invoke 应该在那里发生但是..我不知道该怎么做..
有什么建议吗?
dispatcher = System.Windows.Threading.Dispatcher.FromThread(newWindowThread);
这将获取该特定线程的调度程序,从那里可以做到
dispatcher.Invoke(() =>
{
/*here you can access the plotter */
});