2008-08-16 25 views
5

'daki HttpWebRequest.BeginGetRequestStream içinden nasıl güncellerim? Birden çok dosyayı HttpWebRequest öğesinin BeginGetRequestStream öğesini kullanarak yüklüyorum, ancak veri akışını yayınlarken yazdığım ilerleme kontrolünü güncellemek istiyorum.UI'mı Silverlight

Bu nasıl yapılmalıdır, Dispatch.BeginInvoke öğesini (aşağıdaki gibi) veriyi akışa iten döngü içinde aramayı denedim, ancak tarayıcı işini tamamlayana kadar kilitler, böylece bir tür çalışan gibi görünür/UI iş parçacığı kilitlenme.

Bu

hemen hemen ne yaptığımı bir kod parçacığı geçerli:

class RequestState 
{ 
    public HttpWebRequest request; // holds the request 
    public FileDialogFileInfo file; // store our file stream data 

    public RequestState(HttpWebRequest request, FileDialogFileInfo file) 
    { 
     this.request = request; 
     this.file = file; 
    } 
} 

private void UploadFile(FileDialogFileInfo file) 
{ 
    UriBuilder ub = new UriBuilder(app.receiverURL); 
    ub.Query = string.Format("filename={0}", file.Name); 

    // Open the selected file to read. 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ub.Uri); 
    request.Method = "POST"; 

    RequestState state = new RequestState(request, file); 
    request.BeginGetRequestStream(new AsyncCallback(OnUploadReadCallback), state); 
} 

private void OnUploadReadCallback(IAsyncResult asynchronousResult) 
{ 
    RequestState state = (RequestState)asynchronousResult.AsyncState; 
    HttpWebRequest request = (HttpWebRequest)state.request; 

    Stream postStream = request.EndGetRequestStream(asynchronousResult); 
    PushData(state.file, postStream); 
    postStream.Close(); 

    state.request.BeginGetResponse(new AsyncCallback(OnUploadResponseCallback), state.request); 
} 

private void PushData(FileDialogFileInfo file, Stream output) 
{ 
    byte[] buffer = new byte[ 4096 ]; 
    int bytesRead = 0; 

    Stream input = file.OpenRead(); 
    while((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
     bytesReadTotal += bytesRead; 

     App app = App.Current as App; 
     int totalPercentage = Convert.ToInt32((bytesReadTotal/app.totalBytesToUpload) * 100); 

     // enabling the following locks up my UI and browser 
     Dispatcher.BeginInvoke(() => 
     { 
      this.ProgressBarWithPercentage.Percentage = totalPercentage; 
     }); 
    } 
} 

cevap

1

Bunu söyleyecektim, sanırım olmadığını Silverlight 2'nin HttpWebRequest desteklenen akışı, istek verisi içine tamponlu olur çünkü tamamen hafıza. Son baktığım zamandan beri bir süre olmuştu, bu yüzden Beta 2'nin destekleyip desteklemediğini görmek için geri döndüm. Peki çıkıyor. Geri döndüğüme ve bunu söylemeden önce okunduğuma sevindim. AllowReadStreamBuffering öğesini false olarak ayarlayarak etkinleştirebilirsiniz. Bu mülkü HttpWebRequest'inize ayarladın mı? Bu senin bloğuna sebep olabilir. MSDN Reference

  • File upload component for Silverlight and ASP.NET
  • Düzenleme

    • , sizin için başka referans buldum. Dosyayı parçalara bölerek bu yaklaşımı takip etmek isteyebilirsiniz. Bu geçen Mart ayında yazıldı, bu yüzden Beta 2'de çalışıp çalışmayacağını bilmiyorum.

    0

    Bunun için, bu linklere bir göz atacağım, yine de verilerimi parçalamayı düşünüyordum, bunun dışında herhangi bir makul ilerleme raporu alabilmemin tek yolu gibi görünüyor.