2016-09-16 144 views
4

我需要用空字符串返回一個Task<string>方法返回的任務<string>

public static Task<string> AsyncTest() 
{  
    return new Task<string>(() => string.Empty); //problem here 

    // this method would work: 
    // return new WebClient().DownloadStringTaskAsync(@"http://www.google.de"); 
} 

public static void Workdl(string input) 
{ 
    Console.Write("OUT: " + input.Substring(0, 100)); 
} 

的方法這段代碼編譯,但是當我這樣稱呼它

Task<string> dlTask = AsyncTest(); 
Workdl(await dlTask); 
await Task.WhenAll(dlTask); //Task never completes 

它從來沒有決定。

回答

14

除非您正在編寫自己的任務管理系統,否則您應該永遠不要使用new Task(...)

但是,除此之外,這種情況在這種情況下不起作用的原因是因爲new Task(...)本身不會啓動。它只是圍繞代理構造任務對象。

你應該明確地啓動它:

var t = new Task(() => string.Empty); 
t.Start(); 
return t; 

或者乾脆使用Task.Run代替:

return Task.Run(() => string.Empty); 

(這將是我的建議,以避免使用new Task(...)

現在,在這種情況下,我會完全不同。

如果您實際上不需要運行任務,則可以簡單地在現有結果周圍創建一個已完成的任務。我說「如果」的原因是你的問題中的例子可能因爲這個問題而變得虛弱,你實際上可能有代碼,在這種情況下,你應該選擇本段以上的代碼。然而,如果你需要堅持異步方法簽名返回的任務,但實際上並不需要旋轉了一個任務,那麼這樣做:

return Task.FromResult(string.Empty); 

這只是「開出已經完成」。

相關問題