单线公寓问题

时间:2012-11-27 08:56:32

标签: c# winforms multithreading thread-safety

从我的主要表单中,我调用以下内容来打开一个新表单

MyForm sth = new MyForm();
sth.show();

一切都很好但是这个表单有一个组合框,当我将其AutoCompleteMode切换为建议和附加时,我在显示表单时遇到了这个异常:

在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。确保您的Main函数上标有STAThreadAttribute。

我已根据异常请求在我的main函数上设置了此属性:

[STAThread]
static void Main(string[] args)
{ ...

我可以请一些帮助来了解可能出现的问题。

示例代码:

private void mainFormButtonCLick (object sender, EventArgs e)
{
    // System.Threading.Thread.CurrentThread.SetApartmentState(ApartmentState.STA); ?
    MyForm form = new MyForm();
    form.show();
}

设计

this.myCombo.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
this.myCombo.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.myCombo.FormattingEnabled = true;
this.myCombo.Location = new System.Drawing.Point(20, 12);
this.myCombo.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.myCombo.Name = "myCombo";
this.myCombo.Size = new System.Drawing.Size(430, 28);
this.myCombo.Sorted = true;
this.myCombo.TabIndex = 0; phrase";

设置数据源

public MyForm(List<string> elem)
{
    InitializeComponent();
    populateColorsComboBox();
    PopulateComboBox(elem);
}

public void PopulateComboBox(List<string> list )
{
    this.myCombo.DataSource = null;
    this.myCombo.DisplayMember = "text";
    this.myCombo.DataSource = list;
}

3 个答案:

答案 0 :(得分:3)

Main(string[] args)真的是你的切入点吗?

也许你有另一个没有参数的Main()重载。或者另一个类中的其他一些Main()。请打开Project属性并查找起始对象。

答案 1 :(得分:2)

Windows Forms应用程序必须在STA方法中运行。

见这里:Could you explain STA and MTA?

由于控件本身使用本机窗口句柄,因此必须遵守STA模型,因此Windows窗体开始发挥作用。我确实相信你在这个特定地方得到错误的原因是AutoCompletion在内部创建/使用了第二个线程。

据我所知,线程模型必须在Main中设置,稍后更改它只能从STA到MTA,但不能反过来

答案 2 :(得分:1)

作为一个疯狂的想法:在第二种形式中创建源列表的深层副本,并将组合框绑定到列表的副本而不是原始副本。