2

我看到CopyToAsyncCancellationToken争论。但我不需要CopyToAsync,因为我的代码已经在后台线程中执行。我只想有一个CopyTo重载,CancellationToken它每次复制 bufferSize 字节时都会检查它。有没有内置的实现?

4

3 回答 3

2

我刚刚采用了 .NET CopyTo 实现并在循环中添加了一行:

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。

在我看来,与构建自己的 Cancellation 实现相比,您将花费更少的时间来实现CopyToAsync(而不是)(并且减少错误/错误的风险)。CopyTo

于 2013-03-25T10:06:07.277 回答
0

对于没有更好答案的情况:您可以使用 10 行 C# 代码实现一个同步复制循环作为可重用的辅助方法。看看 Reflector 是如何做到的。

于 2013-03-25T10:08:43.267 回答