在多线程中打开模态窗口

在可以调用 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

这里解释了,我是这样理解的模式窗口给自己设定了一些访问限制。你要打开它就必须把自己的限制一下。

 

posted @ 2013-06-17 19:19  viola  阅读(660)  评论(0编辑  收藏  举报