c# - 为什么锁定控件本身并同步访问它会导致死锁?
问题描述
private void Button_Click(object sender, EventArgs e)
{
Thread t = new Thread(() =>
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(30);
lock (lstDownload)
{
ListViewItem lvi = new ListViewItem(i.ToString());
Invoke((MethodInvoker)delegate
{
lstDownload.Items.Add(lvi);
});
}
}
});
t.IsBackground = true;
t.Start();
}
看,在这种情况下,重复快速运行此方法会导致死锁,从而冻结整个 UI。
但是如果我更改为lock(AnyOtherControl)
无论我如何运行该方法,都不会导致死锁。
任何人都可以解释发生了什么并说出这两种情况之间的区别。(尤其是为什么死锁不再出现锁定不同的控件)。
解决方案
推荐阅读
- python-3.x - 自动输入命令提示符
- python - 大于 RAM 的 Numpy 数组:写入磁盘还是核外解决方案?
- machine-learning - Keras Adam 优化器学习率超参数与单独计算的网络参数学习率有何关系?
- json - 尝试从 Bash 中的 JSON 文件加载消息负载以发送到 Slack 通道
- testing - 当配置为不运行时,带有标签的功能仍在运行
- bash - curl api 请求中的变量
- printing - ZPL 语言 - 无法旋转标签
- java - 如何使用具有多个 bean 定义的 Spring ObjectProvider
- java - 使用动态规划解决问题
- apache-kafka - 当我收到缺少所需参数“[topic]”的错误时,如何尝试阅读 kafka 中的主题