在单元测试时,我无法让Dispatcher运行我传递给它的委托。当我运行程序时,一切正常,但是,在单元测试期间,以下代码将无法运行:
this.Dispatcher.BeginInvoke(new ThreadStart(delegate { this.Users.Clear(); foreach (User user in e.Results) { this.Users.Add(user); } }), DispatcherPriority.Normal, null);
我在viewmodel基类中有以下代码来获取Dispatcher:
if (Application.Current != null) { this.Dispatcher = Application.Current.Dispatcher; } else { this.Dispatcher = Dispatcher.CurrentDispatcher; }
我需要做一些事情来初始化Dispatcher进行单元测试吗?分派器从不运行委托中的代码。
通过使用Visual Studio单元测试框架,您无需自己初始化Dispatcher。完全正确,调度程序不会自动处理其队列。
您可以编写一个简单的帮助程序方法“ DispatcherUtil.DoEvents()”,该方法告诉Dispatcher处理其队列。
C#代码:
public static class DispatcherUtil { [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] public static void DoEvents() { DispatcherFrame frame = new DispatcherFrame(); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrame), frame); Dispatcher.PushFrame(frame); } private static object ExitFrame(object frame) { ((DispatcherFrame)frame).Continue = false; return null; } }
您也可以在 WPF应用程序框架(WAF)中 找到此类。