首页 > 解决方案 > 为什么锁定控件本身并同步访问它会导致死锁?

问题描述

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)无论我如何运行该方法,都不会导致死锁。

任何人都可以解释发生了什么并说出这两种情况之间的区别。(尤其是为什么死锁不再出现锁定不同的控件)。

标签: c#.netwinformsasynchronousdeadlock

解决方案


推荐阅读