【发布时间】:2012-11-27 08:56:31
【问题描述】:
在我的主窗体中,我调用以下命令来打开一个新窗体
MyForm sth = new MyForm();
sth.show();
一切都很好,但是这个表单有一个组合框,当我将它的 AutoCompleteMode 切换为建议和附加时,我在显示表单时遇到了这个异常:
在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记了 STAThreadAttribute。
我已经按照异常的要求在我的主函数上设置了这个属性:
[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;
}
【问题讨论】:
-
如果清理并重建项目会怎样?
-
你见过类似的question吗?
-
您如何显示表单?在主线程内还是在单独的线程内?
-
我没有使用任何 BackgroundWOrker,只是在与 MainForm 相同的线程上创建所有内容
-
如果您在致电
form.Show()之前添加if (Thread.CurrentThread.GetApartmentState() != ApartmentState.MTA) MessageBox.Show("Not STA");,是否会显示消息框?
标签: c# winforms multithreading thread-safety