伙计们,我发现自己处于一种奇怪的情况。我需要将不同返回类型的任务链接在一起。通常情况下,你可以做这样的事情各种返回类型的链接任务(TPL和HttpWebRequest)
Task<T> t = Task<T>.Factory.StartNew(() => ... some T instance);
Task t2 = t.ContinueWith<U>(parent => ...);
return Task.WhenAll(t, t2);
然而,我的并发症就在于使用FromAsync
辅助方法来包装一个开始/结束对和该转换成任务。我试图编写一个异步客户端使用HttpWebRequest和.NET 4.0上的任务(所以等待不是一个选项)。
我的问题是的FromAsync
返回类型是任务本身,其防止从我在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;
}
'return Task.WhenAll(t,t2);'Task.WhenAll没有这样的过载。 –
@HamletHakobyan确实如此,那是因为它是一个'params'方法(至少在.Net 4.5上,在4.0上,根本没有'WhenAll()')。 – svick
如果您使用VS2012和[Microsoft.Bcl.Async](http://nuget.org/packages/Microsoft.Bcl.Async),则可以在.Net 4.0上使用'await'。 – svick