5

サーバーへの非同期呼び出しを使用してデータをアップロードするために Webclient を使用しています。

    WebClient webClient = new WebClient();
   webClient.UploadDataAsync(uri , "PUT", buffer, userToken);

DatauploadProgress と DatauploadCompleted Events を適切なコールバック関数に添付しました

        // Upload Date Progress
        webClient.UploadProgressChanged += new 
        UploadProgressChangedEventHandler(UploadProgressCallback);

      // Upload Date Progress
     void UploadProgressCallback(object sender, UploadProgressChangedEventArgs e)
    {
        // Magic goes here 
     logger.writeToLog("Percentage =" + e.ProgressPercentage);
    }

アップロードされたファイルのサイズに関係なく、e.ProgressPercentage常に返さ50れます( 10kb から 60mb までのさまざまなサイズを試しました)。関数自体は 2 回しか呼び出されず (非常に高速です)、パーセンテージは 50 を示します! ..特に大きなファイルでは非論理的です...

e.BytesSentどちらも役に立ちません..常にファイルサイズをバイト単位で表示します:S(例:ファイルサイズが 63,000 の場合、私は取得e.BytesSent = 63,000してe.ProgressPercentage= 50

誰かが私に問題を指摘できますか?

4

1 に答える 1

7

アップロードの進行状況を監視する場合は、UploadDataの代わりにUploadFileAsyncを使用する必要があります。

UploadDataAsyncを使用すると、ファイルを手動でチャンクして進行状況を表示することになっています(少なくとも、MSDNでそのように記述されているのを見たことがありませんが、この問題に関する私自身の経験から判断したものです)。

探しているのは、代わりにUploadFileAsyncを使用することです。これにより、UploadProgressChangedイベントが正しく呼び出されます。次に、正しく反映されるはずのイベント引数プロパティBytesSentおよびTotalBytesToSendを表示できます。

この背後にある理論的根拠は、データを送信するときに、データストリームのチャンクをループして、進行状況トラッカーを手動でインクリメントできるのに対し、ファイルではできないことです(.NETがアップロード全体を管理します)。個人的には、UploadDataAsyncの場合にUploadProgressChangedイベントが無効な情報で呼び出される理由がないため、何か怪しいものがあると感じています。有効で正しい情報で呼び出されるか、まったく呼び出されないかのどちらかです。

とにかく、UploadFileAsyncを試してみて、どうなるか見てみましょう。

于 2010-01-26T17:01:55.483 に答える