我在ViewModel中有代码通过任务调用服务.任务完成后,它将填充ObservableCollection.问题是,它等待的任务,通过使用ContinueWith方法,并提供TaskScheduler.FromCurrentSynchronizationContext的任务调度,使OC获取UI线程上更新完成.
到目前为止一切都那么好,但是当谈到单元测试时,它会抛出一个异常,说"当前的SynchronizationContext可能不会被用作TaskScheduler".如果我在单元测试中使用模拟SynchronizationContext,那么ObservableCollection会抛出一个错误,因为它是根据调度程序线程进行更新的.
有什么方法可以解决这个问题吗?
谢谢.
我们在 WPF 应用程序中遇到了一个非常奇怪的问题。
在启动时,我们的应用程序会触发一些服务请求。然后当窗口加载时没有响应,直到我们按下一个键。CPU 使用率为 0%。
它看起来像一个 UI 死锁,虽然不是真正的死锁——我们可以调整它的大小并移动它。附加调试器时,我们看到主线程在 Win32.UnsafeNativeMethods.GetMessageW 上 - 它不像您通常在此类问题中看到的那样等待锁定。
然后,如果我们按下一个键,它会继续处理我们传递给 Dispatcher.BeginInvoke 的操作。
这发生在调试和发布版本上,但仅当它是由 MSBuild 工具构建时才会发生。如果我在 VS2010 和 VS2012 的 PC 上构建应用程序 - 都针对 .NET 4.0 - 问题永远不会发生。
关于如何识别阻止调度程序执行操作直到按下某个键的任何想法?
问候。
PS - 请参阅下面的 UI 线程堆栈跟踪。
WindowsBase.dll!MS.Win32.UnsafeNativeMethods.GetMessageW(ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x14 字节
WindowsBase.dll!System.Windows.Threading。 Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x80 字节 WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame ) + 0x75 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame 帧) + 0x49 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.Run() + 0x4b 字节
PresentationFramework.dll!System.Windows.Application.RunDispatcher(对象忽略) + …