Я использую асинхронные команды, основанные на 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.