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出来过后马上就消失了. 问了论坛上的朋友解释说 不用这个,线程函数跑完了,当前线程就自动结束了,所以必须用这个.
另外我问你,一个程序是不是同一时间只能产生一个FileDialog啊,也就是你产生了一个FileDialog后,程序就应该锁住。但是如果你在其它线程中这样做了,显然没法锁住程序,所以是禁止的行为。另外你打开Main()函数所在的那个Program.cs看下就知道了,程序启动时运行的那个线程加上了[STAThread]标志,在那里面new了第一个form1出来的。其它线程不是STA线程。
{
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());
}
}