我看到CopyToAsync
有CancellationToken
个参数。但我不需要CopyToAsync
,因为我的代码已在后台线程中执行。我只想要CopyTo
重载,它需要CancellationToken
并在每次复制bufferSize字节数时检查它。有没有内置的实现?
答案 0 :(得分:1)
我可以说内置的实现是CopyToAsync
和CancellationToken。
在我看来,您将花费更少的时间来实现CopyToAsync
(而非CopyTo
),而不是构建您自己的取消实施(并减少错误/错误的风险)。
答案 1 :(得分:1)
我刚接受.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设计人员并不关心取消长时间运行的同步操作。
答案 2 :(得分:0)
对于没有更好的答案到达的情况:您可以使用10行C#实现同步复制循环作为可重用的辅助方法。看看Reflector如何做到这一点。