2017-05-23 26 views
3

我被@StephenHaunts這裏https://stephenhaunts.com/2014/10/10/simple-async-await-example-for-asynchronous-programming/#comments我將如何訪問此任務<String>在C#中的返回值?

下面我這篇文章有什麼的代碼最後返回語句,裏面LongRunningOperation目的。

private static async Task<string> LongRunningOperation() 
{ 
    int counter;  
    for (counter = 0; counter < 50000; counter++) 
    { 
     Console.WriteLine(counter); 
    }  
    return "Counter = " + counter; 
} 

現在我所知道的是:

  1. 由於我在調用這個LongrunningOperationTask.Run,它不管這個期待已久的方法默認情況下返回應返回。那麼爲什麼它沒有這樣做。

  2. 如果我使用Task.Result屬性,那麼它將運行同步並阻止調用線程,這是不推薦的。

我要問的是:

  1. 我怎麼會得到這個返回在調用現場打印的價值?

  2. 爲什麼@Stephen在沒有必要的時候寫了這樣的陳述?

在此先感謝。

+1

你是什麼意思*在不需要*的情況下寫了那條語句?該方法的返回類型是'異步任務',當然你**有**返回一個字符串或它不會編譯。 –

回答

4

最後return聲明在代碼中的用途是什麼,在LongRunningOperation之內。

返回字符串「Counter = 50000」並證明循環已完成。這不是很有用,但顯然這是一個玩具的例子。您可以聲明您的方法爲static async Task而不是static async Task<string>,並且不返回值。

由於我在調用這個LongrunningOperationTask.Run,就應該不管這個期待已久的方法默認情況下返回返回。那麼爲什麼它沒有這樣做。

是什麼讓你覺得它沒有這樣做?以下片段是否不會返回預期結果?

string s = await Task.Run(() => LongrunningOperation()); 
// s should now contain "Counter = 50000". 

注:調用Task.Run沒有await將返回,而不是結果的潛在的未完成的任務

如果我使用Task.Result屬性,那麼它將運行同步並阻止調用線程,這是不推薦的。

確切的說,這就是爲什麼你不應該這樣做。

我怎樣才能得到這個返回的值打印在呼叫點?

通過做返回值的東西。無論是將其分配給一個字符串(如上所示),或直接打印出來:

Console.WriteLine(await Task.Run(() => LongrunningOperation())); 

爲什麼@Stephen寫了這句話時,有沒有必要呢?

那你必須問斯蒂芬。 :-)

+3

值得注意的是,嚴格來說,'LongrunningOperation'將始終同步運行,因爲它是一個CPU綁定操作,即使封裝在Task.Run中也是如此。唯一的區別是在後者中,它在另一個線程中執行(但又是同步)。 –

+0

@FedericoDipuma:這取決於你對「(a)同步」的定義。有些人會認爲多線程根據定義是「異步的」,但是你是對的,在通常的「C#異步 - 等待」意義上它不是「異步」的。 – Heinzi

+0

@FedericoDipuma,呵呵那麼你能給我一個簡單的基於控制檯的async.await示例,它會以各種方式異步表現。根據我的理解,上面的示例是異步的,因爲它不會中止調用線程。 –

-1

一個symple

private async Task DoSomething() 
{ 
    var counter = await LongRunningOperation(); 
    //More code. 
} 

就行了。

編輯:

你也可以這樣做:

private void DoSomething() 
{ 
    var counter = LongRunningOperation().GetAwaiter().GetResult(); 
    //More code 
} 

如果你不想使該方法異步。

+0

Downvoters,小心解釋你爲什麼downvoted? – Tvde1

相關問題