Я загружаю несколько файлов с помощью 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;
});
}
}