2008-08-16 3 views
5

Я загружаю несколько файлов с помощью BeginGetRequestStream из HttpWebRequest, но я хочу обновить контроль выполнения, который я написал, пока я отправляю поток данных.Как обновить свой пользовательский интерфейс из HttpWebRequest.BeginGetRequestStream в Silverlight

Как это сделать, я попытался вызвать Dispatch.BeginInvoke (как показано ниже) из цикла, который толкает данные в поток, но он блокирует браузер до тех пор, пока он не будет закончен, поэтому он, кажется, находится в каком-то рабочем месте/ui тупик.

Это фрагмент кода довольно много, что я делаю:

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

ответ

1

Я собирался сказать, что я не думаю, что Silverlight 2 в HttpWebRequest поддерживается потоковое, поскольку данные запроса получает буферном в память полностью. Прошло некоторое время с тех пор, как я в последний раз смотрел на него, поэтому я вернулся, чтобы посмотреть, поддерживает ли Beta 2. Хорошо получается. Я рад, что вернулся и прочитал, прежде чем заявить об этом. Вы можете включить его, установив для параметра AllowReadStreamBuffering значение false. Вы установили это свойство на свой HttpWebRequest? Это может вызвать ваш блок.

Edit, нашел другую ссылку для вас. Вы можете следовать этому подходу, разбивая файл на куски. Это было написано в марте прошлого года, поэтому я не уверен, что он будет работать в бета-версии 2 или нет.

0

Благодарим за это, я посмотрю на эти ссылки, я все равно рассматриваю возможность передачи моих данных, это единственный способ получить от вас разумные отчеты о проделанной работе.

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