我使用基于 https://msdn.microsoft.com/en-us/magazine/dn630647.aspx
该命令的执行程序如下:
(package) =>
{
return Task.Run(() =>
{
dataProvider.Save(package);
// emulate long running operation
for (int i = 0; i < 5000000; ++i)
{
string[] ar = new string[1000];
}
}).ContinueWith(t =>
{
messagingService.Send(new PackageSavedMessage
{
Id = package.Id,
Name = package.Name,
});
}, TaskScheduler.FromCurrentSynchronizationContext());
当我在应用程序中单击保存按钮时,它运行良好,即它异步等待,然后触发 ContinueWith 。
但是当我尝试从单元测试中调用它时
[Test]
public async Task SaveCommand_Test()
{
using (var scope = _container.BeginLifetimeScope())
{
var vm = scope.Resolve<MainViewModel>();
AsyncCommandBase acb = vm.PackageViewModels[0].SaveCommand as AsyncCommandBase;
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
await acb.ExecuteAsync(package);
}
}
ContinueWith 立即触发,而不等待任务完成
如果我未设置SynchronizationContext,则会收到错误消息
当前的SynchronizationContext不能用作TaskScheduler。
答案 0 :(得分:2)
您的执行者不需要使用ContinueWith
;较现代的await
也可以正常工作(请注意await
will automatically capture and resume its context,因此不需要显式的TaskScheduler
):
async (package) =>
{
await Task.Run(() =>
{
dataProvider.Save(package);
// emulate long running operation
for (int i = 0; i < 5000000; ++i)
{
string[] ar = new string[1000];
}
});
messagingService.Send(new PackageSavedMessage
{
Id = package.Id,
Name = package.Name,
});
}