在.NET 4.0中将WebClient转换为TPL?

我有以下webclient代码,

public static void PostDataAsync(string url, NameValueCollection parameters, object state, Action callback) { var client = new WebClient(); client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; client.UploadValuesCompleted += new UploadValuesCompletedEventHandler(callback); client.UploadValuesAsync(new Uri(url), null, parameters, state); } 

我想将其转换为Task。 我试图使用Task.Factory.FromAsync执行此操作但失败了

这是我找到的答案,

 public static Task PostDataAsync(string url, NameValueCollection parameters, object state) { var tcs = new TaskCompletionSource(state: state); var client = new WebClient(); client.UploadValuesCompleted += (obj, args) => { if (args.Cancelled) tcs.SetCanceled(); else if (args.Error != null) tcs.SetException(args.Error); else tcs.SetResult(args.Result); }; client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; client.UploadValuesAsync(new Uri(url), null, parameters, state); return tcs.Task; }