2014-09-08 2 views
0

사용자가 우편 번호를 다운로드 할 때 진행률 표시 줄을 진행시키고 싶습니다. 이건 내 코드입니다 :다운로드 용 진행률 표시 줄 만들기

private void DoSincroFit() 
    { 
     HttpWebRequest request = HttpWebRequest.CreateHttp(url); 

     //Add headers to request 
     request.Headers["Type"] = "sincrofit"; 
     request.Headers["Device"] = "1"; 
     request.Headers["Version"] = "0.000"; 
     request.Headers["Os"] = "WindowsPhone"; 

     request.BeginGetResponse(new AsyncCallback(playResponseAsync), request); 
    } 

    public async void playResponseAsync(IAsyncResult asyncResult) 
    { 
     //Declaration of variables 
     HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 

     try 
     { 
      string fileName = "sincrofit.rar"; 

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

       var newZipFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 

       using (var writeStream = await newZipFile.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 

            //I think the progress bar going here! 
           } 
           await dataWriter.StoreAsync(); 
           await outputStream.FlushAsync(); 
           dataWriter.DetachStream(); 
          } 
         } 
        } 
       } 

      } 
     } 
     catch 
     { 
      CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
      dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
      { 
       //Declaration of variables 
       SMethods.Message_Dialog("Download has stopped!", "Error"); 
      }); 
     } 
    } 

그리고 이것은 이것은 외부 클래스가있을 때 내가 진행률 표시 줄을 만들 수있는 배경 방법

public async Task<string> doSync(ProgressBar bar) 
    { 
     //Declaration of variables 
     string response = await DoRequest("CHECK", "1", "0.000", "WindowsPhone"); 
     pBar = bar; 

     //When is 1, the checkConnection will connect 
     if (response == "1") 
     { 
      response = response + "," + await DoRequest("SIZEFIT", "1", "0.000", "WindowsPhone"); 

      DoSincroFit(); 
      response += "," + await DoRequest("DELSINC", "1", "0.000", "WindowsPhone"); 

      return response; 
     } 

     return "0,0,0"; 
    } 

를 호출 방법? 정확히 doSync와 DoSincroFit은 Sync.cs에 속하며 My UI는 MyPage.Xaml.cs입니다.

미리 감사드립니다.

답변

0

마침내 해결할 수 있습니다! 진행률 표시 줄이 지금 작동합니다!

private void DoSincroFit() 
    { 
     HttpWebRequest request = HttpWebRequest.CreateHttp(url); 

     //Add headers to request 
     request.Headers["Type"] = "sincrofit"; 
     request.Headers["Device"] = "1"; 
     request.Headers["Version"] = "0.000"; 
     request.Headers["Os"] = "WindowsPhone"; 

     //Windows Cache Problems 
     request.Headers["Cache-Control"] = "no-cache"; 
     request.Headers["Pragma"] = "no-cache"; 

     dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
     request.BeginGetResponse(new AsyncCallback(playResponseAsync), request); 
    } 

    public async void playResponseAsync(IAsyncResult asyncResult) 
    { 
     //Declaration of variables 
     HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 

     try 
     { 
      //For download file with stream 
      string fileName = "sincrofit.rar"; 

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

       //For acces Local folder of phone device 
       var newZipFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 

       //Progress bar and their update 
       using (var writeStream = await newZipFile.OpenAsync(FileAccessMode.ReadWrite)) 
       { 
        using (var outputStream = writeStream.GetOutputStreamAt(0)) 
        { 
         using (var dataWriter = new DataWriter(outputStream)) 
         { 
          using (Stream input = webResponse.GetResponseStream()) 
          { 
           var totalSize = 0; 
           int read; 

           uint zeroUint = Convert.ToUInt32(0); 
           uint readUint; 

           while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
           { 
            totalSize += read; 

            await dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
            { 
             //Declaration of variables 
             pBar.Value = totalSize * 100/sizeFit; 
            }); 

            readUint = Convert.ToUInt32(read); 
            IBuffer ibuffer = buffer.AsBuffer(); 
            dataWriter.WriteBuffer(ibuffer, zeroUint, readUint); 
           } 

           await dataWriter.StoreAsync(); 
           await outputStream.FlushAsync(); 
           dataWriter.DetachStream(); 
          } 
         } 
        } 
       } 

      } 
     } 
     catch 
     { 
      //For control errors stopped progress bar 
      dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
      { 
       //Declaration of variables 
       SMethods.Message_Dialog("Download has stopped!", "Error"); 
      }); 
     } 
    } 

이 테스트 진행 막대하지만, u는 1024 같은과 큰 지퍼의 다음 사용 버퍼를 다운로드해야하는 경우 ... 1 바이트로하기 때문에하는 것은 끔찍한 될 수 있습니다! 모두에게 감사드립니다! :)

1

MVVM을 사용하는 경우 변경된시기를 알리는 등록 정보를 만들 수 있습니다. 그런 다음 UI 표현에 대해 실제로 알지 않아야하는 외부 코드는 이러한 속성을 단순히 업데이트합니다.

그런 다음 UI 코드에서 컨트롤을 해당 속성에 바인딩합니다.

응용 프로그램에 대해 더 알지 못해서 여기서는 구체적인 내용을 제공 할 수 없습니다.

관련 문제