2013-12-03 2 views
-1

У меня есть следующий код WebClient,Преобразование WebClient в TPL в .NET 4.0?

public static void PostDataAsync(string url, NameValueCollection parameters, object state, Action<object, UploadValuesCompletedEventArgs> 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, но не

+0

http://msdn.microsoft.com/en-us/library/system. net.http.httpclient (v = vs.110) .aspx – SLaks

+1

Покажите нам, как вы пытались. –

+0

Если вы используете VS2012, вы можете установить пакет Microsoft.Bcl.Async NuGet, а затем просто использовать 'async/await'. –

ответ

4

Вот ответ, который я нашел,

public static Task<byte[]> PostDataAsync(string url, NameValueCollection parameters, object state) 
{ 
    var tcs = new TaskCompletionSource<byte[]>(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; 
} 
+0

Я воспользуюсь тем, что редактировал ваш ответ, чтобы обрабатывать 'Cancelled' и' Error' –

+0

@SriramSakthivel, ok thanks – user960567

+0

Если этот ответ работает на вас, тогда вы должны его принять. –

Смежные вопросы