2017-02-25 12 views
0

私はこのメソッドを呼び出しています: Windows.Foundation.IAsyncOperation<AppServiceResponse> AppServiceConnection.SendMessageAsync(ValueSet message)タスクを実行するための汎用拡張メソッドを記述できますか?

'IAsyncOperation'には "GetAwaiter"の定義が含まれておらず、 'IAsyncOperation'タイプの最初の引数を受け入れる拡張メソッド "GetAwaiter"がありません( 'システム ')

その後、私はそれを変更します?それがコンパイルされてしまった

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

私の最初の質問は、なぜ私はSendMessageAsyncを待つことができないのですか? 「GetAwaiterの定義がありません」とはどういう意味ですか?

私の2番目の質問は、私も他の方法を実行する必要があることです。 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

async/awaitを使用する場合は、 'Task'、' Task '、または' void'を返す必要があります。 'IAsyncOperation'はそれらのどれでもありません...しかし、既に' 'WindowsRuntimeSystemExtensions'(https://msdn.microsoft.com/en-us/library/system.windowsruntimesystemextensions(v = vs)のタスクに変換する方法はあります。 .110).aspx)クラス。 –

+1

これはあなたが望むことを全くしていないことに注意してください。非同期操作を待っていません。非同期操作を開始する新しいスレッドを生成しています。待機しているタスクの戻り値は '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.

はい、ただし正しく動作しません。 mikeがコメントしたように、返品タイプTask.RunTask<IAsyncOperation<T>>です。待たれている場合は、返品(お待ちしています)実際のIAsyncOperation<T>です。したがって、を開始し、バックグラウンドスレッドの操作はに開始します。 - に待っています。

したがって、拡張メソッドを書くべきではありません。ここではTask.Runを使用しないでください。欠落している参照を追加するだけで、うまくいくはずです。

関連する問題