2015-02-15 4 views
0

Я пытаюсь реализовать загрузку заданного URL-адреса. Кстати мой код:Преобразование AsyncCallback в ожидаемую задачу

private string url; 
private StorageFile outputFile; 

public void download() 
{ 
    HttpWebRequest request = HttpWebRequest.CreateHttp(url); 
    request.BeginGetResponse(new AsyncCallback(playResponseAsync), request); 
} 
public async void playResponseAsync(IAsyncResult asyncResult) 
{ 
    //Declaration of variables 
    HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 

    try 
    { 

     using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult)) 
     { 
      byte[] buffer = new byte[1024]; 

      using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       using (var outputStream = writeStream.GetOutputStreamAt(0)) 
       { 
        using (var dataWriter = new DataWriter(outputStream)) 
        { 
         using (Stream input = webResponse.GetResponseStream()) 
         { 
          var totalSize = 0; 
          for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length)) 
          { 
           dataWriter.WriteBytes(buffer); 
           totalSize += size; //get the progress of download 
          } 
          await dataWriter.StoreAsync(); 
          await outputStream.FlushAsync(); 
          dataWriter.DetachStream(); 
         } 
        } 
       } 
      } 
      Debug.WriteLine("Finished"); 
     } 
    } 
    catch 
    { 

    } 
} 
} 

Я хочу, чтобы мой способ загрузки, чтобы иметь следующую подпись

Task<bool> download(); 

(Возвращение верно, если загрузка удалась, и ложь в противном случае)

делает его ожидаемая задача. Но я не владею C# и не знаю, как это сделать. Вы можете мне помочь?

Благодаря

+2

Посмотрите в использовании 'HttpClient' для создания веб-запроса. Это упростит вам работу, так как выставляет TAP api. –

ответ

2

Task.Factory.FromAsync есть упростить использование старого шаблона асинхронный

public async Task<bool> download() 
{ 
    HttpWebRequest request = HttpWebRequest.CreateHttp(url); 
    HttpWebResponse webResponse = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, request); 

    try 
    { 
     using (webResponse) 
     { 
      byte[] buffer = new byte[1024]; 

      using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       using (var outputStream = writeStream.GetOutputStreamAt(0)) 
       { 
        using (var dataWriter = new DataWriter(outputStream)) 
        { 
         using (Stream input = webResponse.GetResponseStream()) 
         { 
          var totalSize = 0; 
          for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length)) 
          { 
           dataWriter.WriteBytes(buffer); 
           totalSize += size; //get the progress of download 
          } 
          await dataWriter.StoreAsync(); 
          await outputStream.FlushAsync(); 
          dataWriter.DetachStream(); 
         } 
        } 
       } 
      } 
      Debug.WriteLine("Finished"); 
     } 
    } 
    catch 
    { 
     return false; 
    } 
} 
return true; 
} 

Но я хотел бы использовать новый HttpClient как предложено

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