async signalr hub - 返回root任务而不是推送事件

时间:2013-11-26 20:39:21

标签: c# asynchronous task-parallel-library signalr

我正在使用.net 4.0。我有一个async signalR Hub,它返回一个Task。 root任务还有一个与之关联的ContinueWith。

  1. 当我返回第一个/ root任务时,我的Clients.Caller推送不会出现在浏览器中。
  2. 当我返回ContinueWith任务时,我的Clients.Caller推送会出现在浏览器中。
  3. 所以确实将更新推送到浏览器....

    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然后我可以对后续的服务调用做出断言。

    当我得到

    时,我无法启动第二项任务
      

    启动可能不会在继续任务上调用

1 个答案:

答案 0 :(得分:1)

使用可以Task编辑的Start()应该非常少见。大多数情况下,您不需要此功能,并且如您所发现的那样,它不适用于continuation和其他类型的Task s(例如来自C#5.0的async Task)。

因此,我认为你应该转而使用已经开始的Task。这意味着:

  1. 更改DoSomeIO(),以便返回已启动的Task
  2. 更改模拟以返回已开始或甚至已完成的Task,例如使用TaskCompletionSource
  3. 从单元测试中删除对Start()的调用。
  4. 当您完成所有这些操作后,您应该可以在单元测试中使用工作版本而不会出现任何问题。