私はこのメソッドを呼び出しています: 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();
async/awaitを使用する場合は、 'Task'、' Task '、または' void'を返す必要があります。 'IAsyncOperation'はそれらのどれでもありません...しかし、既に' 'WindowsRuntimeSystemExtensions'(https://msdn.microsoft.com/en-us/library/system.windowsruntimesystemextensions(v = vs)のタスクに変換する方法はあります。 .110).aspx)クラス。 –
これはあなたが望むことを全くしていないことに注意してください。非同期操作を待っていません。非同期操作を開始する新しいスレッドを生成しています。待機しているタスクの戻り値は 'IAsyncOperation'です。あなたはそれを待つ必要があります。 Jeff Mercadoが指摘しているように、すでにこれらのタスクをタスクに変換する方法があります。 –
Task.Runを使用すると危険な複雑さがあり、そうする方法を信じられないほど慎重にする必要があります。 http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html –