編集(承認後)
すぐにはわからないかもしれませんが、@ Servyの答えは、Unwrap
under monodroidのカスタム実装を必要とせずに正しいです-私のコメントでは、存在しないと言いましたが、確かに存在します。
編集を終了
私はRESTfulWebサービスを使用するアプリをたくさん書いていますが、タスクを適切に使用する方法を知っていると思っていても、そうではないことがわかりました。シナリオは、Windowsストア用に実装されたコードを持っているということです-を使用してasync/await
、MonoDroidとほぼ同じものを実装する必要があります-それはありません(使用したくないビルドハックがない場合)。
この質問の問題を、整数を非同期で取得するための単純な一連のタスクに要約しました。次に、続けて、その整数から構築された文字列を変換する別の非同期タスクを起動します。C#5では、これは次のようになります。
注-もちろんTask.FromResult<T>
、実際の非同期コードの代わりにここで使用しています
private async Task<string> GetStringAsync()
{
return await GetStringFromIntAsync(await GetIntAsync());
}
private async Task<int> GetIntAsync()
{
return await Task.FromResult(10);
}
private async Task<string> GetStringFromIntAsync(int value)
{
return await Task.FromResult(value.ToString());
}
これを継続ベースのパターンに変換するために、私はこれを試しました:
private Task<string> GetStringAsync()
{
//error on this line
return GetIntAsync().ContinueWith(t => GetStringFromIntAsync(t.Result));
}
private Task<int> GetIntAsync()
{
return Task.FromResult(10);
}
private Task<string> GetStringFromIntAsync(int value)
{
return Task.FromResult(value.ToString());
}
ただし、このメソッドは、継続が.の代わりにを返すことになるという意味をGetStringFromIntAsync
返すため、これは正しくありません。Task<string>
Task<Task<string>>
Task<string>
GetStringFromIntAsync
ただし、メソッドを明示的に待機することは機能することがわかりました。
private Task<string> GetStringAsync()
{
return GetIntAsync().ContinueWith(t =>
{
var nested = GetStringFromIntAsync(t.Result);
nested.Wait();
return nested.Result;
});
}
問題は、しかし、それを行う正しい方法であるということですが、呼び出し元が待機するある種の継続を返すことはできませんか?
私はタスクをかなり使用しましたが、このように異なるタイプのタスクを連鎖させることはしませんでした(もちろんasync
/await
を除く)。そして、ここで怒っているように感じます。助けていただければ幸いです。