为什么 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 线程不再像地狱一样滞后了,因为我按照下面人们建议我做的步骤进行了操作:
我使用 await Task.Run()
而不是 Task.Run()
来记录异常,并且我在 InitializeComponent
之后添加了 Control.CheckForIllegalCrossThreads = true;
这样我可以更好地理解我的错误.
我从异步任务中删除了 ALL UI 线程调用(比如更新 UI 元素),我改为(在我的案例)使用计时器更新我需要的局部变量中的 UI 元素。
类似于 2. 但相反,这意味着只有“resource-intensive”任务(如 ComputeHash()
)在我的异步中任务。
所以让我解释一下:我正在用 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 线程不再像地狱一样滞后了,因为我按照下面人们建议我做的步骤进行了操作:
我使用
await Task.Run()
而不是Task.Run()
来记录异常,并且我在InitializeComponent
之后添加了Control.CheckForIllegalCrossThreads = true;
这样我可以更好地理解我的错误.我从异步任务中删除了 ALL UI 线程调用(比如更新 UI 元素),我改为(在我的案例)使用计时器更新我需要的局部变量中的 UI 元素。
类似于 2. 但相反,这意味着只有“resource-intensive”任务(如
ComputeHash()
)在我的异步中任务。