如果ComboBox.DropDownStyle == Simple,则“跨线程操作无效”

时间:2012-05-04 17:19:13

标签: c# .net windows combobox thread-safety

我有一个在通过Invoke调用的方法中显示的Forms,因为该方法是从另一个线程调用的。在我需要打开的表单中,我有一个带有ComboBox的UserControl。如果ComboBox.DropDownStyleSimple,则表单会显示爆炸

  

InvalidOperationException:跨线程操作无效:控制   'comboBox1'从线程以外的线程访问   创建于。

如果我将ComoBox.DropDownStyle设置为默认值(DropDown),我没有问题。

我现在有点难以理解(甚至相信)所以这里有一个简化的例子来重现它:

  1. 创建一个新的winforms项目。
  2. 创建两个表单和一个用户控件。
  3. 在用户控件中创建一个ComboBox。
  4. 在Form2中放置一个用户控件的实例。
  5. 在Form1代码中输入:

  6. private Form form;
    private delegate void ShowDelegate();
    private ShowDelegate showDelegate;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        showDelegate = Show;
        new Thread(Run).Start();
    }
    
    private void Run()
    {
        form = new Form2();
        Invoke(showDelegate);
    }
    
    private void Show()
    {
        form.Show();
    }
    

    请务必将事件设置为Form1_Load

    1. 运行它并看到它正常工作。
    2. ComboBox.DropDownStyle更改为Simple并将其视为无效!
    3. 请问这个问题有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

只需移动

form = new Form2();

对于你的Show()方法,它将起作用。

表单在您启动的主题上初始化,然后就可以了。但是你可能想长期检查这种行为......