Unit testing C语言中的任务包装器#

Unit testing C语言中的任务包装器#,unit-testing,asynchronous,c#-4.0,task-parallel-library,task,Unit Testing,Asynchronous,C# 4.0,Task Parallel Library,Task,我正在使用WinForms(.NET4.0)中的任务来执行诸如WCF调用之类的冗长操作。应用程序已经在大量使用任务的产品中(几乎所有使用任务的方法都是void) 在单元测试期间,我们使用了autorestevents(在实际代码中)来确定给定任务何时完成,然后执行断言 这让我想到几乎所有的AutoResetEvent都是浪费精力。他们只是在满足单元测试的需要,没有别的 当实际代码运行时,我们是否可以同样地围绕任务创建一个包装器。。。它们应该在后台工作,在单元测试的情况下,它们应该是同步的 类似于

我正在使用WinForms(
.NET4.0
)中的任务来执行诸如
WCF
调用之类的冗长操作。应用程序已经在大量使用任务的产品中(几乎所有使用任务的方法都是
void

在单元测试期间,我们使用了
autorestevent
s(在实际代码中)来确定给定任务何时完成,然后执行断言

这让我想到几乎所有的
AutoResetEvent
都是浪费精力。他们只是在满足单元测试的需要,没有别的

当实际代码运行时,我们是否可以同样地围绕任务创建一个包装器。。。它们应该在后台工作,在单元测试的情况下,它们应该是同步的

类似于下面的
BackgroundWorker
链接


为什么不能在包装器中简单地对任务使用continuation,如下所示:

var task = ...
task.ContinueWith(t => check task results here)
此外,如果他们有返回类型
任务
,那么您可以在那里使用
等待
,然后进行断言:

[Test]
public async Task SynchronizeTestWithRecurringOperationViaAwait()
{
    var sut = new SystemUnderTest();
    // Execute code to set up timer with 1 sec delay and interval.
    var firstNotification = sut.StartRecurring();
    // Wait that operation has finished two times.
    var secondNotification = await firstNotification.GetNext();
    await secondNotification.GetNext();
    // Assert outcome.
    Assert.AreEqual("Init Poll Poll", sut.Message);
}
另一种方法(来自同一篇文章)是使用自定义任务调度器,在单元测试的情况下,它将是同步的:

[Test]
public void TestCodeSynchronously()
{
    var dts = new DeterministicTaskScheduler();
    var sut = new SystemUnderTest(dts);
    // Execute code to schedule first operation and return immediately.
    sut.StartAsynchronousOperation();
    // Execute all operations on the current thread.
    dts.RunTasksUntilIdle();
    // Assert outcome of the two operations.
    Assert.AreEqual("Init Work1 Work2", sut.Message);
}

相同的MSDN杂志包含nice。另外,
async void
应仅用作事件处理程序,所有其他方法应具有
async Task
签名。

为什么不能对这些任务使用
Wait()
来查找它们何时完成?方法早就用void编写好了。使用任务返回更新所有方法将是一项非常大的任务。我以为您已经想更新方法来删除
AutoResetEvent
s并引入
Task
包装器。我的建议怎么会更糟?就像我在问题中提到的。。。我使用的是.NET 4.0,因此无法使用异步和await@Abhash786您可以使用
Microsoft.Bcl.Async
。尽管它确实需要C#5.0编译器。