2013-04-22 10 views
0

많은 이미지를 로컬 폴더에 다운로드하고 저장해야합니다. 또한 이미지를 다운로드하는 동안 UI를 업데이트해야합니다. 이제 이미지를 하나씩 다운로드하려면 다음 코드를 사용하고 있습니다. 그러나 문제는 각 다운로드 요청에서 UI가 차단된다는 것입니다. 다운로드 방법은 어떻게 처리해야합니까? 나는 스레딩에 대해 많이 모른다. 누구든지 좋은 방법으로 나를 도울 수 있습니까?Windows Phone 8의 이미지 다운로드

public async Task<T> ServiceRequest<T>(string serviceurl, object request) 
{ 
    string response = ""; 
    httpwebrequest = WebRequest.Create(new Uri(serviceurl)) as HttpWebRequest; 
    httpwebrequest.Method = "POST"; 

    httpwebrequest.ContentType = "application/json"; 
    byte[] data = Serialization.SerializeData(request); 

    using (var requestStream = await Task<Stream>.Factory.FromAsync(httpwebrequest.BeginGetRequestStream, httpwebrequest.EndGetRequestStream, null)) 
    { 
     await requestStream.WriteAsync(data, 0, data.Length); 
    } 

    response = await httpRequest(httpwebrequest); 

    var result = Serialization.Deserialize<T>(response); 
    return result; 
} 


public async Task<string> httpRequest(HttpWebRequest request) 
{ 
    try 
    { 
     string received; 

     using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null))) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       using (var sr = new StreamReader(responseStream)) 
       { 
        received = await sr.ReadToEndAsync(); 
       } 
      }    
      response.Close(); 
     } 

     return received; 
    } 
    catch(Exception ex) 
    { 
     return ""; 
    } 
} 

답변

2

나는 System.Net.Http.HttpClient을 사용하는 것이 좋습니다. 당신은 Nuget에서 그것을 얻을 수 있습니다, 그냥뿐만 아니라 사전 릴리스 채널을 포함하도록 검색 옵션을 선택하십시오. 그러나 아직 공식적으로 출시되지 않았기 때문에 현재 프로덕션 코드에서 사용할 수 없습니다. 그리고 그것이 언제 마지막으로 발표 될지에 대한 어떤 말도 없습니다. 그러나 당신이 배우는 경우에, 당신은 그것을 자유롭게 사용할 수 있습니다. 그리고 그것은 당신 같은 것을 매우 간단하게 만듭니다. 여기 당신이 원하는 행복한 우연의 일치 :)으로 정확하게 수행, 내 코드의 샘플입니다 :

당신이에 설명 된 방법 중 하나를 참조 할 수 후 격리 된 저장소에서 이미지를 표시하기 위해
private IEnumerable<string> CountPictures(int from, int to, string folder) 
{ 
    for (int i = from; i < to; i++) 
     yield return string.Format("{0}/image{1}.jpg", folder, i.ToString("D2")); 
} 

private async Task ImportImages() 
{ 
    HttpClient c = new HttpClient(); 
    int count = 0; 
    c.BaseAddress = new Uri("http://www.cs.washington.edu/research/imagedatabase/groundtruth/", UriKind.Absolute); 
    foreach (var pic in CountPictures(1, 48, "leaflesstrees")) 
    { 
     var pic_response = await c.GetAsync(pic, HttpCompletionOption.ResponseContentRead); 
     if (pic_response.IsSuccessStatusCode) 
     { 
      await SaveImageAsync(pic.Replace('/', '_'), await pic_response.Content.ReadAsStreamAsync()); 
      Debug.WriteLine(pic + " imported"); 
      count++; 
     } 
    }   
    Debug.WriteLine(string.Format("{0} images imported", count)); 
} 

private Task SaveImageAsync(string filename, Stream stream) 
{ 
    var task = Task.Factory.StartNew(() => 
    { 
     if (stream == null || filename == null) 
     { 
      throw new ArgumentException("one of parameters is null"); 
     } 
     try 
     { 
      using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       using (IsolatedStorageFileStream targetStream = isoStore.OpenFile(filename, FileMode.Create, FileAccess.Write)) 
       { 
        byte[] readBuffer = new byte[4096]; 
        int bytesRead = -1; 
        stream.Position = 0; 
        targetStream.Position = 0; 

        while ((bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) > 0) 
        { 
         targetStream.Write(readBuffer, 0, bytesRead); 
        } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      System.Diagnostics.Debug.WriteLine("DocumentStorageService::LoadImage FAILED " + e.Message); 
     } 
    }); 
    return task; 
} 

내 대답 here.

+0

의견을 보내 주셔서 감사합니다. 하지만 곧 내 신청서를 풀어 줘야 해. 그래서 다른 방법을 제안 할 수 있니? – Sachin123