2008-08-16 14 views
5

Tôi đang tải lên nhiều tệp bằng cách sử dụng BeginGetRequestStream của HttpWebRequest nhưng tôi muốn cập nhật điều khiển tiến độ mà tôi đã viết trong khi đăng lên luồng dữ liệu.Làm cách nào để cập nhật giao diện người dùng của tôi từ bên trong HttpWebRequest.BeginGetRequestStream trong Silverlight

Làm thế nào để thực hiện điều này, tôi đã thử gọi Dispatch.BeginInvoke (như bên dưới) từ vòng lặp đẩy dữ liệu vào luồng nhưng nó khóa trình duyệt cho đến khi nó kết thúc./ui thread bế tắc.

Đây là một đoạn mã của khá nhiều những gì tôi đang làm:

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; 
     }); 
    } 
} 

Trả lời

1

tôi sẽ nói rằng, tôi không nghĩ rằng Silverlight 2 của HttpWebRequest hỗ trợ trực tuyến, bởi vì các dữ liệu yêu cầu được đệm vào bộ nhớ hoàn toàn. Nó đã được một thời gian kể từ lần cuối cùng tôi nhìn vào nó mặc dù, do đó tôi đã trở lại để xem nếu Beta 2 hỗ trợ nó. Vâng hóa ra nó. Tôi vui vì tôi đã quay lại và đọc trước khi nói điều đó. Bạn có thể kích hoạt nó bằng cách đặt AllowReadStreamBuffering thành false. Bạn đã đặt thuộc tính này trên HttpWebRequest của mình chưa? Điều đó có thể gây ra khối của bạn.

Chỉnh sửa, tìm thấy một tài liệu tham khảo cho bạn. Bạn có thể muốn làm theo cách tiếp cận này bằng cách chia nhỏ tệp thành các phần. Điều này được viết vào tháng 3 năm ngoái, do đó tôi không chắc liệu nó có hoạt động trong bản Beta 2 hay không.

0

Cảm ơn vì điều đó, tôi sẽ xem xét các liên kết đó, dù sao tôi cũng đang xem xét việc chunking dữ liệu của mình, dường như là cách duy nhất tôi có thể nhận được bất kỳ báo cáo tiến độ hợp lý nào từ đó.

Các vấn đề liên quan