我有一个Windows Forms应用程序,该应用程序使用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/

10-13 00:02