C# - 即使在调用之后,在不同的线程中添加UserControl也会导致异常

时间:2016-09-12 08:32:55

标签: c# multithreading winforms user-controls

我在winfroms中构建了一个自定义UserControl,并通过辅助线程将其添加到Panel。

我知道在通过辅助线程添加控件时,您需要调用主线程来执行此操作。所以我做了..但我仍然得到一个异常,说“跨线程操作无效:控制'pictureBoxImage'从一个线程访问,而不是它创建的线程。”

我被困住了,不知道是什么导致了这个因为我尝试通过在每个自定义UserControl方法上放置一个断点来调试它,但是它们中没有抛出异常。

case class foo{
  def bar = 7
}

class qaz{
   val foobar = bar  
}

这是自定义的UserControl类

private void addControl(Control i_ControllToAdd, Control i_ParentControl)
    {
        if (i_ParentControl.InvokeRequired)
        {
            i_ParentControl.Invoke(new Action(() => addControl(i_ControllToAdd, i_ParentControl)));
            return;
        }

        i_ParentControl.Controls.Add(i_ControllToAdd);
    }

1 个答案:

答案 0 :(得分:5)

应该在UI线程上创建任何Control,并且也可以从同一个线程访问

它为您提供异常的原因是因为您在一个线程(您的辅助线程)上创建i_ParentControl.Invoke(new Action(() => addControl(new Control(), i_ParentControl))); 并使用Invoke语句将其添加到另一个线程(您的UI线程)上的UI。 / p>

要摆脱这种情况,请确保在一个线程上创建控件并在其创建的同一线程上访问它。

以下代码段可能不是您想要的,但它只是为了让您了解它;

function matrix(m, n) {
 var arr = [];
 for (  m = 9; m>0; m--)
    {
      for (var n = m;n>0; n--)
         {
           arr.push(new Array(n).fill(0))
         }
       return arr;
    }  
 };

var cols=9
var counter=9;
console.log(matrix(counter,cols));