CopyTo带有CancellationToken参数

本文关键字:参数 CancellationToken 带有 CopyTo | 更新日期: 2023-09-27 18:05:56

我看到CopyToAsyncCancellationToken参数。但我不需要CopyToAsync,因为我的代码已经在后台线程中执行。我只想让CopyTo过载,它需要CancellationToken,并在每次复制bufferSize字节量时检查它。是否有任何内置的实现?

CopyTo带有CancellationToken参数

我刚刚采用。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框架设计者不关心长时间运行的同步操作的取消是令人失望的。

我可以说内置实现是CopyToAsync与CancellationToken。

在我看来,你将花费更少的时间来实现CopyToAsync(而不是CopyTo),而不是构建你自己的cancel实现(并且更少的错误/bug风险)。

对于没有更好的答案的情况:您可以使用10行c#来实现同步复制循环,作为可重用的助手方法。看看Reflector是怎么做到的