Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么锁定控件本身并同步访问它会导致死锁? private void按钮\u单击(对象发送者,事件参数e) { 线程t=新线程(()=> { 对于(int i=0;i_C#_.net_Winforms_Asynchronous_Deadlock - Fatal编程技术网

C# 为什么锁定控件本身并同步访问它会导致死锁? private void按钮\u单击(对象发送者,事件参数e) { 线程t=新线程(()=> { 对于(int i=0;i

C# 为什么锁定控件本身并同步访问它会导致死锁? private void按钮\u单击(对象发送者,事件参数e) { 线程t=新线程(()=> { 对于(int i=0;i,c#,.net,winforms,asynchronous,deadlock,C#,.net,Winforms,Asynchronous,Deadlock,在这种情况下,反复快速运行这个方法可能会导致死锁,从而冻结整个UI 但是,如果我更改为lock(AnyOtherControl),无论我如何运行该方法,它都不会导致死锁 有谁能解释一下发生了什么,并说出这两起案件之间的区别吗。(特别是为什么死锁不再锁定不同的控件)。我认为这是因为Invoke()也试图锁定控件?只需使用您自己的锁对象,这样您就可以确切地知道它的用途。您应该在专门用于锁定的对象上调用锁,而不是在控件上调用锁。 private void Button_Click(object sen

在这种情况下,反复快速运行这个方法可能会导致死锁,从而冻结整个UI

但是,如果我更改为
lock(AnyOtherControl)
,无论我如何运行该方法,它都不会导致死锁


有谁能解释一下发生了什么,并说出这两起案件之间的区别吗。(特别是为什么死锁不再锁定不同的控件)。

我认为这是因为Invoke()也试图锁定控件?只需使用您自己的锁对象,这样您就可以确切地知道它的用途。您应该在专门用于锁定的对象上调用锁,而不是在控件上调用锁。
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();
}