Je télécharge plusieurs fichiers à l'aide de BeginGetRequestStream de HttpWebRequest mais je souhaite mettre à jour le contrôle de progression que j'ai écrit pendant que je publie le flux de données.Comment mettre à jour mon interface utilisateur depuis HttpWebRequest.BeginGetRequestStream dans Silverlight
Comment devrait-il être fait, j'ai essayé d'appeler Dispatch.BeginInvoke (comme ci-dessous) à partir de la boucle qui pousse les données dans le flux, mais il verrouille le navigateur jusqu'à ce qu'il semble être dans une sorte de travailleur/Ui thread deadlock.
C'est un extrait de code de à peu près ce que je fais:
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;
});
}
}