2008-08-16 4 views
5

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

Répondre

1

J'allais dire, je ne pensais pas que HttpWebRequest Silverlight 2 de diffusion en continu pris en charge, car les données de demande se tamponne dans mémoire entièrement. Cela faisait longtemps que je ne l'avais pas regardé, donc je suis retourné voir si Beta 2 le supportait. Eh bien, il le fait. Je suis content d'être retourné lire avant de le dire. Vous pouvez l'activer en définissant AllowReadStreamBuffering sur false. Avez-vous défini cette propriété sur votre HttpWebRequest? Cela pourrait causer votre blocage.

Modifier, trouvé une autre référence pour vous. Vous pouvez suivre cette approche en divisant le fichier en morceaux. Cela a été écrit en mars dernier, donc je ne suis pas sûr que cela fonctionnera en Beta 2 ou non.

0

Merci pour cela, je vais jeter un coup d'oeil à ces liens, je considérais quand même le découpage de mes données, semble être le seul moyen d'obtenir des rapports d'avancement raisonnables.

Questions connexes