我打電話給這種方法: 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();
如果您要使用異步/等待,您_必須返回一個「任務」,「任務」或「無效」。 'IAsyncOperation'不是那些......但是已經有方法可以轉換成['WindowsRuntimeSystemExtensions']中的任務(https://msdn.microsoft.com/en-us/library/system.windowsruntimesystemextensions(v = vs .110).aspx)類。 –
請注意,這並不是您想要的。它不在等待異步操作。它產生了一個啓動異步操作的新線程。等待的Task的返回值是'IAsyncOperation'。你需要等待。正如Jeff Mercado指出的那樣,已經有方法將這些轉換爲任務。 –
使用Task.Run存在危險的複雜性,您需要非常小心謹慎地操作。請參閱http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html –