2017-02-25 63 views
0

我打電話給這種方法: Windows.Foundation.IAsyncOperation<AppServiceResponse> AppServiceConnection.SendMessageAsync(ValueSet message)我可以寫通用擴展方法來運行任務嗎?

例如, await connection.SendMessageAsync(initialStatus);

它顯示一個錯誤:「IAsyncOperation」不包含對「GetAwaiter」的定義,並沒有擴展方法「GetAwaiter」接受型的第一參數「IAsyncOperation'could中找到(是否缺少using指令關於」 ?系統「)

然後我將其更改爲:

await Task.Run(() => connection.SendMessageAsync(initialStatus)); 

它得到了編譯。

我的第一個問題是爲什麼我不能等待SendMessageAsync?這意味着什麼「GetAwaiter沒有定義」?

我的第二個問題是我還需要運行其他方法 Windows.Foundation.IAsyncOperation<AppServiceConnectionStatus> AppServiceConnection.OpenAsync()

我寫一個擴展方法:

public static async void AsTask(this IAsyncOperation<AppServiceResponse> operation) 
{ 
    await Task.Run(() => operation); 
} 

所以我可以打電話connection.SendMessageAsync(initialStatus).AsTask();但我可以使擴展方法通用的,所以我也可以撥打像connection.OpenAsync().AsTask();

+1

如果您要使用異步/等待,您_必須返回一個「任務」,「任務」或「無效」。 'IAsyncOperation'不是那些......但是已經有方法可以轉換成['WindowsRuntimeSystemExtensions']中的任務(https://msdn.microsoft.com/en-us/library/system.windowsruntimesystemextensions(v = vs .110).aspx)類。 –

+1

請注意,這並不是您想要的。它不在等待異步操作。它產生了一個啓動異步操作的新線程。等待的Task的返回值是'IAsyncOperation '。你需要等待。正如Jeff Mercado指出的那樣,已經有方法將這些轉換爲任務。 –

+1

使用Task.Run存在危險的複雜性,您需要非常小心謹慎地操作。請參閱http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html –

回答

2

My first question is why I cannot apply await to SendMessageAsync? What exactly does it mean "no definition for GetAwaiter"?

這意味着你」重新缺少對System.Runtime.WindowsRuntime.dll的引用。

Then I change it to [use Task.Run ] It got compiled.

是的,但它不會正常工作。正如邁克所評論的那樣,Task.Run的返回類型是Task<IAsyncOperation<T>>,當等待時返回(不等待)實際IAsyncOperation<T>。所以你只是開始後臺線程上的操作,然後等待那個操作到開始 - 你不等待它到完成

所以,你不應該寫一個擴展方法。你不應該在這裏使用Task.Run。只需添加缺少的參考,你應該沒問題。

相關問題