namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(a));
            t.Start();
        }
        void a() 
        {
            new Form2();
            while (true)
            {
                Application.DoEvents();
            }
        }
    }
}namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            this.Show();
        }        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
        }        private void Form2_Load(object sender, EventArgs e)
        {        }
    }
}
 ,就是,在form1里面创建一个多线程来 new form2(), 然后在form2的钩造方法里用this.show显示出form2, 然后再在form2里面openFileDialog1.ShowDialog();  问题就是openFileDialog1  show不出来, 有异常说"在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。"请问这种情况该如何解决?? while (true)
            {
                Application.DoEvents();
            }
如果不加这一段, form2 show出来过后马上就消失了. 问了论坛上的朋友解释说 不用这个,线程函数跑完了,当前线程就自动结束了,所以必须用这个.  

解决方案 »

  1.   

    话说你何必使用多线程创建Form,没有必要。
    另外我问你,一个程序是不是同一时间只能产生一个FileDialog啊,也就是你产生了一个FileDialog后,程序就应该锁住。但是如果你在其它线程中这样做了,显然没法锁住程序,所以是禁止的行为。另外你打开Main()函数所在的那个Program.cs看下就知道了,程序启动时运行的那个线程加上了[STAThread]标志,在那里面new了第一个form1出来的。其它线程不是STA线程。
      

  2.   

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Thread t = new Thread(new ThreadStart(Test));
                t.SetApartmentState(ApartmentState.STA);
                t.Start();
            }
            void Test()
            {
                Application.Run(new Form2());
            }
        }