0

RestSharp を使用して、単純なファイル アップロード デスクトップ ツールを実装しています。カスタム ストリーム ライターを使用して大きなファイルをリクエストに追加すると (GUI へのアップロードの進行状況を更新するため)、stream.WriteOutOfMemoryException がスローされます。簡略化されたコード例:

...
var request = new RestRequest { Resource = "/test" };
request.Method = Method.POST;
request.AddFile("file", writer, "largefile.iso");

var response = client.Execute(request);
...

private void writer(Stream stream)
{
    using (FileStream reader = File.OpenRead("d:\\download\\largefile.iso"))
    {
      byte[] buffer = new byte[16384]; //16k buffer
      int bytesRead = 0;
      int read = 0;

      while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
      {
        stream.Write(buffer, 0, read);
        bytesRead += read;
        System.Diagnostics.Debug.WriteLine("uploading: " + (int) ((double)bytesRead / reader.Length * 100) + "%");
      }
      reader.Close();
    }

}

これは小さなファイルでは問題なく動作しますが、ストリームの書き込みでメモリ リークが発生し、最終的にクラッシュします。私がここで見逃しているものはありますか?

4

2 に答える 2

0

RestSharp ソースを掘り下げた後、これを自分で解決しました。 http://support.microsoft.com/kb/908573

于 2012-04-19T18:03:05.440 に答える
0

書き込みごとにストリーム バッファをフラッシュするようにしてください。

private void writer(Stream stream)
    {
        using (FileStream reader = File.OpenRead("d:\\download\\largefile.iso"))
        {
            byte[] buffer = new byte[16384]; //16k buffer
            int bytesRead = 0;
            int read = 0;

            while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
            {
                stream.Write(buffer, 0, read);
                stream.Flush();
                bytesRead += read;
                System.Diagnostics.Debug.WriteLine("uploading: " + (int)((double)bytesRead / reader.Length * 100) + "%");
            }
            reader.Close();
        }

    }
于 2012-04-18T13:50:12.920 に答える