运用帕纳约蒂斯Kanavos和斯蒂芬·克利里的信息,我可以写我的testmethods这样的:
[TestMethod]
public void MyTest()
{
Helper.RunInWpfSyncContext(async() =>
{
Assert.IsNotNull(SynchronizationContext.Current);
await MyTestAsync();
DoSomethingOnTheSameThread();
});
}
内的代码现在在WPF同步上下文中运行并处理为用于MSTest的所有异常。 帮手方法来自Stephen Toub:
using System.Windows.Threading; // WPF Dispatcher from assembly 'WindowsBase'
public static void RunInWpfSyncContext(Func<Task> function)
{
if (function == null) throw new ArgumentNullException("function");
var prevCtx = SynchronizationContext.Current;
try
{
var syncCtx = new DispatcherSynchronizationContext();
SynchronizationContext.SetSynchronizationContext(syncCtx);
var task = function();
if (task == null) throw new InvalidOperationException();
var frame = new DispatcherFrame();
var t2 = task.ContinueWith(x=>{frame.Continue = false;}, TaskScheduler.Default);
Dispatcher.PushFrame(frame); // execute all tasks until frame.Continue == false
task.GetAwaiter().GetResult(); // rethrow exception when task has failed
}
finally
{
SynchronizationContext.SetSynchronizationContext(prevCtx);
}
}