5

HttpWebRequestのBeginGetRequestStreamを使用して複数のファイルをアップロードしていますが、データストリームを投稿するときに、作成した進行状況コントロールを更新したいと思います。

これをどのように行うべきか、データをストリームにプッシュするループ内から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;
        } );
    }
}
4

2 に答える 2

1

私が言おうとしていたのは、Silverlight 2 の HttpWebRequest がストリーミングをサポートしているとは思わなかったということです。要求データは完全にメモリにバッファリングされるからです。最後に見たのは久しぶりだったので、Beta 2 がサポートされているかどうかを確認するために戻ってきました。そうですね。それを言う前に戻って読んでよかったです。これを有効にするには、AllowReadStreamBuffering を false に設定します。HttpWebRequest でこのプロパティを設定しましたか? それがあなたのブロックを引き起こしている可能性があります。

編集、あなたのための別の参照を見つけました。ファイルをチャンクに分割することで、このアプローチに従うことができます。これは昨年 3 月に書かれたものなので、ベータ 2 で動作するかどうかはわかりません。

于 2008-08-19T18:09:03.233 に答える
0

そのおかげで、私はそれらのリンクを見ていきます。とにかくデータをチャンク化することを検討していましたが、それから合理的な進捗レポートを取得できる唯一の方法のようです。

于 2008-08-20T17:54:22.940 に答える