c# - 在单元测试中等待异步命令
问题描述
我使用基于 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。
解决方案
您的执行人不需要使用ContinueWith
; 更现代await
的也可以(请注意,await
它将自动捕获并恢复其 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,
});
}
推荐阅读
- javascript - ChartJS 为每列添加不同的行
- powerbi - 如何在 power bi 的 Total Cost Value 列中放置连字符
- java - 是否可以为Android手机和电视创建一个apk?
- swift - 'requestReview()' 在 iOS 14.0 中已弃用
- tesseract - 使用 Apache Tika 进行合理的 Tesseract OCR 设置……?
- flutter - 在 NestedScrollView 内的 tabView 中访问 NestedScrollController(以滚动到某个元素)
- ruby-on-rails - 使用 CombinePDF 将文本添加到现有 PDF 时出现编码问题
- node.js - 带有打字稿的猫鼬?
- php - 在 PHP 中从 SFTP 服务器打开 CSV 文件
- react-native - 当应用程序处于后台状态时如何暂停时钟