两个程序同一类型错误程序1:
private void button1_Click(object sender,EventArgs e)
{
Thread aaa=new Thread(new ThreadStart(bbb));
aaa.Start();
}
void bbb()
{
OpenFileDialog openFileDialog=new OpenFileDialog();
openFileDialog.ShowDialog();//此句报错
}
报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。”
但是我不调试直接运行时,发现在“打开”对话框里面点“我的电脑”里面什么都没有!程序2:
public class Form1:Form
{
    public Form1()
    {
        Button button1=new Button();
        button1.Click+=new EventHandler(button1_Click);
        this.Controls.Add(button1);
    }    private void button1_Click(object sender,EventArgs e)
    {
        Thread aaa=new Thread(new ThreadStart(bbb));
        aaa.Start();
    }
    void bbb()
    {
        Form2 f=new Form2();
        f.ShowDialog();//此句报错
    }
}
public lass Form2:Form
{
    public Form2()
    {
        DataGridView dataGridView=new DataGridView();
        this.Controls.Add(dataGridView);
        DataTable t=new DataTable();
        t.Columns.Add();
        dataGridView.DataSource=t;
    }
}
打开了Form2后按Ctrl+C时报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。”

解决方案 »

  1.   

    参看
    http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
      

  2.   

    or
    http://blog.csdn.net/Knight94/archive/2006/05/27/757351.aspx
      

  3.   

    you can apply my way to yours.
      

  4.   

    主线程 程序入口点 /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    }
      

  5.   

    有[STAThread],而且我在每个方法前加[STAThread]都过
      

  6.   

    有[STAThread],而且我在每个方法前加[STAThread]都试过
      

  7.   

    Knight94(愚翁)所说的Invoke情况我以前也遇到过,但这里好象不是同种问题!程序2中只有一个构造函数,怎么Invoke?你的意思是button1_Click()中Invoke吗?我正在试!还请下面的朋友给点提示!
      

  8.   

    To:kssys() 
    我知道是在新线程中,也知道会出现问题,我现在想解决问题!
      

  9.   

    好的,下面是例子:        public delegate void MyMethod();  //声明一个委托,以使其它线程访问//按钮
    private void button1_Click(object sender,EventArgs e)
    {
    Thread aaa = new Thread(new ThreadStart(OpenDialogOnOtherThread));
                aaa.Start();
    }//其它线程打开对话框
    void OpenDialogOnOtherThread()
            {
                MyMethod OpenDialog = new MyMethod(this.OpenDialog);
                this.Invoke(OpenDialog);  //在当前线程,调用OpenDialog
            }//打开对话框
            void OpenDialog()
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.ShowDialog();
            }
      

  10.   

    果然还是要Invoke!测试也通过,但是我在Main()中怎么用Invoke呢?我是个菜鸟!
      

  11.   

    to 果然还是要Invoke!测试也通过,但是我在Main()中怎么用Invoke呢?我是个菜鸟!你想如何在main中做
      

  12.   

    我是在Main()中启动新线程,然后在新线程中打开的窗体,我上面的例子按照你们的方法用Invoke可以通过,可回到我的程序中才发现Main()中不能调用Invoke!