internal void AsyncComputeHashCallback(IAsyncResult result) { int bytesRead = inputStream.EndRead(result); //检查是否到达流末尾 if (inputStream.Position < inputStream.Length) { //输出进度 string pro = string.Format("{0:0.00}", ((double)inputStream.Position / inputStream.Length) * 100); AsyncCheckProgress?.Invoke(new AsyncCheckEventArgs(AsyncCheckState.Checking, pro)); var output = new byte[buffer.Length]; //分块计算哈希值 hashAlgorithm.TransformBlock(buffer, 0, buffer.Length, output, 0); //异步读取下一分块 inputStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(AsyncComputeHashCallback), null); return; } else { //计算最后分块哈希值 hashAlgorithm.TransformFinalBlock(buffer, 0, bytesRead); } string md5 = BitConverter.ToString(hashAlgorithm.Hash).Replace("-", ""); AsyncCheckProgress?.Invoke(new AsyncCheckEventArgs(AsyncCheckState.Completed, md5)); //关闭流 inputStream.Close(); }
private void MD5Checker_AsyncCheckProgress(AsyncCheckEventArgs e) { AsyncCheckProgress?.Invoke(this, e); }