Wie aktualisiere ich meine Benutzeroberfläche innerhalb HttpWebRequest.BeginGetRequestStream in Silverlight

StackOverflow https://stackoverflow.com/questions/13217

  •  08-06-2019
  •  | 
  •  

Frage

Ich bin das hochladen mehrerer Dateien mit dem BeginGetRequestStream von HttpWebRequest aber ich möchte aktualisieren den Fortschritt zu kontrollieren, die ich geschrieben habe, während ich die post bis die Daten stream.

Wie sollte dies gemacht werden, ich habe versucht, den Aufruf von Dispatch.BeginInvoke (wie unten), die in der Schleife drückt, dass die Daten in den stream aber es sperrt den browser, bis es beendet ist, so scheint es, werden in einer Art Arbeiter - /ui-thread-deadlock.

Dies ist ein code-snippet ziemlich viel, was ich Tue:

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;
        } );
    }
}
War es hilfreich?

Lösung

Ich wollte sagen, dass ich nicht glaube, dass Silverlight 2 HttpWebRequest unterstützt streaming, da die Anforderung Daten in gepufferten Speicher komplett.Es war schon eine Weile her, seit ich das Letzte mal sah, obwohl es, deshalb ging ich zurück, um zu sehen, wenn Beta 2 unterstützt.Nun stellt sich heraus, es funktioniert.Ich bin froh, dass ich ging zurück und Las vor, der besagt, dass.Sie können aktivieren es, indem Sie AllowReadStreamBuffering auf false.Haben Sie diese Eigenschaft auf Ihre HttpWebRequest?Verursachen könnten Ihren block.

Bearbeiten, fand eine weitere Referenz für Sie.Möglicherweise möchten Sie diesem Ansatz Folgen von breaking the file in chunks.Dies geschrieben wurde, im vergangenen März, also bin ich nicht sicher, ob es funktionieren wird, in der Beta 2 ist oder nicht.

Andere Tipps

Vielen Dank dafür, ich werde einen Blick auf die links, ich überlegte, chunking meine Daten sowieso, scheint die einzige Möglichkeit zu sein, die ich bekommen kann jeder angemessenen Fortschritt-Berichte aus es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top