¿Cómo puedo actualizar mi interfaz de usuario dentro de HttpWebRequest.BeginGetRequestStream en Silverlight

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

  •  08-06-2019
  •  | 
  •  

Pregunta

Yo soy de subir varios archivos con el BeginGetRequestStream de HttpWebRequest pero quiero actualizar el control de progreso que he escrito mientras yo cargo el flujo de datos.

¿Cómo debe hacerse esto, he tratado de llamar al Despacho.BeginInvoke (como abajo) de dentro del bucle que empuja a los datos en la corriente, pero se bloquea el navegador hasta su acabado de lo que parece ser algún tipo de trabajador/subproceso de interfaz de usuario de interbloqueo.

Este es un fragmento de código de bastante más de lo que yo estoy haciendo:

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;
        } );
    }
}
¿Fue útil?

Solución

Yo iba a decir eso, yo no creo que Silverlight 2 HttpWebRequest admite streaming, debido a que la solicitud que los datos se almacenan en la memoria por completo.Había sido un tiempo desde la última vez que lo miré a pesar de que, por lo tanto me fui de nuevo a ver si la Beta 2 la apoyaron.Pues resulta que hace.Me alegro de que me fui de nuevo y leer antes de afirmar eso.Usted puede activar la configuración de AllowReadStreamBuffering a false.Hizo establece esta propiedad en su HttpWebRequest?Que podría ser la causa de su bloque.

Edición, encontramos otra referencia para usted.Usted puede seguir este enfoque rompiendo el archivo en trozos.Esto fue escrito el pasado mes de Marzo, por lo tanto no estoy seguro de si funcionará en la versión Beta 2 o no.

Otros consejos

Gracias por eso, voy a echar un vistazo a esos enlaces, yo estaba considerando la posibilidad de fragmentar los datos de mi de todos modos, parece ser la única manera en que puedo conseguir cualquier razonable informes de progreso fuera de él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top