2

議論CopyToAsyncがあるようです。しかし、私のコードはすでにバックグラウンドスレッドで実行されているので、CancellationToken必要ありません。bufferSizeのバイト数をコピーするたびにそれを取得してチェックするオーバーロードが必要CopyToAsyncです。組み込みの実装はありますか?CopyToCancellationToken

4

3 に答える 3

2

.NET CopyToの実装を取得し、サイクルに1行追加しました。

public static void CopyTo(this Stream source, Stream destination, int bufferSize, CancellationToken cancellationToken)
{
    var buffer = new byte[bufferSize];
    int count;
    while ((count = source.Read(buffer, 0, buffer.Length)) != 0)
    {
        cancellationToken.ThrowIfCancellationRequested();
        destination.Write(buffer, 0, count);
    }
}

しかし、.NET Frameworkの設計者が、長時間実行される同期操作のキャンセルを気にしないのは残念です。

于 2013-03-25T10:55:10.590 に答える
1

CopyToAsync組み込みの実装はCancellationTokenを使用していると言えます。

私の意見では、キャンセルの独自の実装を構築するよりもCopyToAsync(ではなくCopyTo)実装に費やす時間が少なくなります(エラー/バグのリスクも少なくなります)。

于 2013-03-25T10:06:07.277 に答える
0

より良い答えが得られない場合:再利用可能なヘルパーメソッドとして、10行のC#を使用して同期コピーループを実装できます。これがどのように行われるかをReflectorで覗いてみてください。

于 2013-03-25T10:08:43.267 に答える