皆さん、私は奇妙な状況に陥っています。返されるさまざまなタイプのタスクを一緒にチェーンする必要があります。通常、このようなことができます
Task<T> t = Task<T>.Factory.StartNew(() => ... some T instance);
Task t2 = t.ContinueWith<U>(parent => ...);
return Task.WhenAll(t, t2);
ただし、私の複雑な点は、FromAsync
ヘルパー メソッドを使用して Begin/End ペアをラップし、それを Task に変換することにあります。.NET 4.0 で HttpWebRequest とタスクを使用して非同期クライアントを作成しようとしています (したがって、await はオプションではありません)。
私の問題は、戻り値の型がFromAsync
Task 自体であるため、ContinueWith
メソッドでそれを使用できないことです (ContinueWith
戻り値の型を期待し、データ自体をTask
オブジェクトにラップします)。
これは私がこれまでに持っていたコードで、正しい機能的な結果をもたらしますが、真に非同期ではありません:
public Task<string> GetHttpRequest(string url, string contentType)
{
var httpWebRequest = CreateHttpWebRequest(url, "GET", contentType);
Task<WebResponse> httpTask = Task.Factory.FromAsync<WebResponse>(httpWebRequest.BeginGetResponse, httpWebRequest.EndGetResponse, null);
return httpTask.ContinueWith(httpAntecedent =>
{
WebResponse webResponse = httpAntecedent.Result;
Stream responseStream = webResponse.GetResponseStream();
byte[] data = new byte[webResponse.ContentLength];
var streamReadTask = Task<int>.Factory.FromAsync(responseStream.BeginRead, responseStream.EndRead, data, 0, data.Length, TaskCreationOptions.AttachedToParent);
return streamReadTask.ContinueWith(parent =>
{
responseStream.Close();
webResponse.Close();
return Encoding.UTF8.GetString(data);
});
}).Result;
}