2013-11-26 57 views
0

我正在使用.net 4.0。我有一個異步信號集線器,它返回一個任務。 根任務也有一個與之關聯的ContinueWith。異步信號集線器 - 返回根任務不推事件

  1. 當我返回1st/root任務時,我的Clients.Caller按鈕不會出現在瀏覽器中。
  2. 當我返回ContinueWith任務時,我的Clients.Caller推送出現在瀏覽器中。

所以這確實推送更新了瀏覽器....

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; 
} 

這是爲什麼?

我問的原因是因爲我可以單元測試第二種情況,但不能第一種。使用第二種場景,我可以開始任務,然後等待它完成,控制權將跳入繼續,然後我可以對後續服務調用做出斷言。

,因爲我得到一個

開始可能無法在後續任務

+0

'Start()'只能在一個特殊情況下工作(當你有一個使用構造函數創建的Task時)。在所有其他情況下,'Start()'沒有任何意義,因爲Task已經啓動,或者它自己啓動。 – svick

+0

另外,你能解釋更多關於你的單元測試問題嗎? – svick

+0

@svick我使用這個擴展返回我一個任務在我的測試...公共靜態IReturnsResult ReturnsAsync ( 這IReturns >設置,TResult值) 其中TMock:類 { 返回設置。返回(新任務(()=>值)); }。然後我只是調用task.Start(); task.Wait(); ....然後讓我的斷言。正如我所提到的,如果我從集線器返回根任務,但如果我返回continuewith任務,則不會有效。謝謝 – jonho

回答

1

被稱爲使用Task s表示可以Start()版應該是非常罕見的,我不能啓動第二個任務。大多數情況下,您不需要此功能,並且您發現它不適用於延續和其他種類的Task(例如,來自C#5.0的異步Task)。

因此,我認爲你應該切換到已經開始使用Task到處。這意味着:

  1. 更改DoSomeIO()使其返回已經開始Task
  2. 改變你的模擬返回開始或甚至完成Task,例如通過使用TaskCompletionSource
  3. 從單元測試中刪除對Start()的調用。

當你這麼做的時候,你應該可以在你的單元測試中使用工作版本而不會有任何問題。

+0

優秀。謝謝。測試現在通過並回調到continuewith,在我的測試中添加了task.wait()之後。 – jonho