在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。
首先, 模态窗口会阻塞线程的,等它响应完毕后才继续执行线程。它到底是只会阻塞主线程,还是其他的线程也可以,先做个试验。
SaveFileDialog sfd = new SaveFileDialog();
sfd.ShowDialog();
Thread thread = new Thread(() => {
SaveFileDialog sfd22 = new SaveFileDialog();
sfd22.ShowDialog();
});
thread.Start();
上面代码抛出异常。如果按着异常的提示,把线程thread的特征设置为单线程单元模式,
SaveFileDialog sfd = new SaveFileDialog();
sfd.ShowDialog();
Thread thread = new Thread(() => {
SaveFileDialog sfd22 = new SaveFileDialog();
sfd22.ShowDialog();
});
thread.ApartmentState = ApartmentState.STA;
thread.Start();
代码可以正常运行。由此可以得出结论:模式窗口阻塞的是单线程单远模式的线程,不论是否是主线程。刚才之所以能在主线程运行正常,因为工程自动的把主线程设置了STA这个特性。
那么什么是单线程单元模式呢?
http://msdn.microsoft.com/zh-cn/library/system.threading.apartmentstate.aspx
这里解释了,我是这样理解的模式窗口给自己设定了一些访问限制。你要打开它就必须把自己的限制一下。