2012-12-13 53 views
1

我有以下NUnit測試類:等待返回任務的方法 - 永久旋轉?

[TestFixture] 
public class Tests 
{ 
    async Task<string> GetMessageAsync() 
    { 
     return "Hello from GetMessageAsync!"; 
    } 

    Task<string> GetMessageTask() 
    { 
     return new Task<string>(() => "Hello from GetMessageTask!"); 
    } 

    [Test] 
    public async void AwaitAsyncMethod() 
    { 
     Assert.AreEqual("Hello from GetMessageAsync!", await GetMessageAsync()); 
    } 

    [Test] 
    public async void AwaitTaskMethod() 
    { 
     Assert.AreEqual("Hello from GetMessageTask!", await GetMessageTask()); 
    } 
} 

的第一次測試,AwaitAsyncMethod(),在執行時成功完成立即。第二個測試AwaitTaskMethod()從來沒有完成。但它確實編譯。

爲什麼第二次測試從不完成?爲什麼我可以編譯等待非異步方法,如果看起來它實際上不工作?讓我們說出於某種原因,我想要一個非異步方法來返回一個可以等待的任務 - 我如何改變這個代碼來完成這個任務?

回答

5

new Task(...)返回未啓動的Task
在您致電Start()之前,該任務永遠不會結束,任何等待它的任何內容都將永遠不會運行。

相反,您可以撥打Task.Run(),它會爲您創建並開始一項任務。

+0

啊哈。 Task.Run就是我所缺少的。謝謝。 – RationalGeek