zoukankan      html  css  js  c++  java
  • 在多线程中打开模态窗口

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

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

  • 相关阅读:
    C++课程的第一次实验
    First C++
    7-12 关于堆的判断
    大笨钟
    7-14 喊山
    L3-010 是否完全二叉搜索树 (30分)
    7-13 天梯地图
    7-10 排座位
    7-9 抢红包
    帅到没朋友
  • 原文地址:https://www.cnblogs.com/363546828/p/3140911.html
Copyright © 2011-2022 走看看