我正在使用.net 4.0。我有一个async signalR Hub,它返回一个Task。 root任务还有一个与之关联的ContinueWith。
所以确实将更新推送到浏览器....
public class MyHub : Hub
......
public Task DoSomething()
{
return myService
.DoSomeIO()
.ContinueWith(t => {
Clients.Caller.helloWorld("hello world");
//do other stuff
});
}
此不 ..
public class MyHub : Hub
......
public Task DoSomething()
{
var rootTask = myService.DoSomeIO();
rootTask.ContinueWith(t => {
Clients.Caller.helloWorld("hello world");
//do other stuff
});
return rootTask;
}
为什么会这样?
我问的原因是因为我可以对第二种情况进行单元测试,但不能用于第一种情况。使用第二个场景我可以启动任务,然后等待它完成,控制将跳转到continuewith然后我可以对后续的服务调用做出断言。
当我得到
时,我无法启动第二项任务启动可能不会在继续任务上调用
答案 0 :(得分:1)
使用可以Task
编辑的Start()
应该非常少见。大多数情况下,您不需要此功能,并且如您所发现的那样,它不适用于continuation和其他类型的Task
s(例如来自C#5.0的async Task
)。
因此,我认为你应该转而使用已经开始的Task
。这意味着:
DoSomeIO()
,以便返回已启动的Task
。Task
,例如使用TaskCompletionSource
。Start()
的调用。当您完成所有这些操作后,您应该可以在单元测试中使用工作版本而不会出现任何问题。