为什么 ComputeHash() 仍在阻塞异步任务中的 UI 线程?

Why is ComputeHash() still blocking UI thread in an async task?

所以让我解释一下:我正在用 C# 使用 MD5 计算哈希值来制作文件签名扫描器。我遇到的一个问题是 ComputeHash() 会阻塞 UI 线程。于是我想到了Task.Run(),这样可以解决我的问题,至少我希望如此

即使将哈希计算(和整个)放在异步任务中,它仍然会阻塞,或者至少,减慢 UI 线程。如果我删除该哈希计算,UI 线程将不再被阻塞。

这是我的一小段代码:

Task.Run(() =>
        {
            if (int.Parse(label5.Text) != int.Parse(label7.Text))
            {
                listBox1.SelectedIndex++;
                label11.Text = listBox1.SelectedItem.ToString();

                /*progressBar1.Increment(1);
                label5.Text = progressBar1.Value.ToString();
                int percentage = Convert.ToInt32(progressBar1.Value / (double)progressBar1.Maximum * 100);
                label2.Text = "Scanning files (" + percentage + "%)";*/
                label2.Text = "Scanning";

                label9.Text = currentThreats.ToString();
                try
                {
                    StringBuilder buff = new StringBuilder();
                    using (MD5 md5 = MD5.Create())
                    {
                        using (FileStream stream = File.OpenRead(label11.Text))
                        {
                            byte[] hash = md5.ComputeHash(stream);
                            buff.Append(BitConverter.ToString(hash).Replace("-", string.Empty));
                        }
                    }

                    if (Reference.VirusList.Contains(buff.ToString())) currentThreats++;
                }
                catch { }

                scanned++;
                label5.Text = scanned.ToString();
            }
            else
            {
                StopCurrentScan(false);
            }
        });

注意 :这是 运行 在定时器中,间隔为 1 毫秒 。只是精确一下,以防它可能有助于解决问题。

好吧,现在我的 UI 线程不再像地狱一样滞后了,因为我按照下面人们建议我做的步骤进行了操作:

  1. 我使用 await Task.Run() 而不是 Task.Run() 来记录异常,并且我在 InitializeComponent 之后添加了 Control.CheckForIllegalCrossThreads = true; 这样我可以更好地理解我的错误.

  2. 我从异步任务中删除了 ALL UI 线程调用(比如更新 UI 元素),我改为(在我的案例)使用计时器更新我需要的局部变量中的 UI 元素。

  3. 类似于 2. 但相反,这意味着只有“resource-intensive”任务(如 ComputeHash())在我的异步中任务。