c# - 在后台线程上散列大文件

标签 c# .net winforms backgroundworker hash

我有一个 Windows 窗体应用程序,它使用 BackgroundWorker 异步散列文件。我通过检查每个被散列的文件之间的 CancellationPending 来实现取消。哈希本身本质上是这样的:

var sha1 = new SHA1CryptoServiceProvider();
byte[] hash = sha1.ComputeHash(
    new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));

唯一的问题是对于特别大的文件 - 数百兆字节或千兆字节 - 哈希操作会阻止取消,直到该文件完成为止。

什么是最好的修改方法,以便在文件被散列时检查取消 - 例如每 N 毫秒或每 N 字节?

最佳答案

您可以创建自己的可取消流并将其作为哈希函数的输入提供。沿着这些线的东西:

class CancellableFileStream : FileStream {

  readonly BackgroundWorker backgroundWorker;

  public CancellableFileStream(BackgroundWorker backgroundWorker, String path, FileMode mode, FileAccess access, FileShare share)
    : base(path, mode, access, share) {
    this.backgroundWorker = backgroundWorker;
  }

  public override Int32 Read(Byte[] array, Int32 offset, Int32 count) {
    if (this.backgroundWorker.CancellationPending)
      return 0;
    return base.Read(array, offset, count);
  }

}

关于c# - 在后台线程上散列大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342071/

相关文章:

c# - 操作数据集

c# - DataTrigger 当大于一个数

c# - 使用 Asp.Net Core 强制语言环境

c# - 如何在 mschart 中添加多个 x 轴?

C# 使用 WebClient 下载分块编码内容

c# - new 运算符如何与 C# 中的委托(delegate)一起使用

.net - 如何停止显示多个对话框?

c# - 数据绑定(bind)到父级可能为 null 的嵌套属性

.net - 使用 Console.ReadKey 读取 Unicode

c# - 三元运算符中的意外行为