在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。

出错环境:

1、在Thread线程中,调用ShowDialog()方法

2、在线程定时器中,调用ShowDialog()方法

3、在Task任务中调用ShowDialog()方法

出错异常:

当执行到.ShowDialog()方法的时候,就会出现如下错误提示:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。”

出错原因:

1、首先先确认一下程序主入口是否有STAThreadAttribute标记,如果没有请加上[STAThread]查看问题是否解决

2、由于该操作在新创建的线程中执行,是不能访问UI的,也就是直接调用ShowDialog()方法确实是有问题的。非UI线程不能打开窗口

解决方案:

1、Thread 线程

通过将线程的 ApartmentState 属性设置为ApartmentState 枚举值之一,可以控制所创建的单元的类型。

其中:

STA:Thread 将创建并进入一个单线程单元;

MTA:Thread 将创建并进入一个多线程单元;

Unknown:尚未设置 ApartmentState 属性。

代码如下:

Thread th = new Thread(()=> new Form1().ShowDialog());
th.SetApartmentState(ApartmentState.STA);
th.Start();

这是网上常用的做法

2、System.Threading.Timer 线程定时器

见下文!!

3、Task 任务

Task封装的是任务,是工作内容,不是线程。一个Task可能在任何线程上执行,所以Task不会提供线程属性,也不该在异步方法中使用Thread类,更不应该在Task里面修改线程的ApartmentState属性,因为这个线程可能会执行其他的Task。亦或者说STA 线程不能是线程池线程!! 见下文!!


因此!!大招在此!!!

Thread\Threading.Timer\Task中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”相关推荐

  1. python3中input()方法报错traceback变量未定义的解决方法

    python3中input()方法报错traceback变量未定义的解决方法 参考文章: (1)python3中input()方法报错traceback变量未定义的解决方法 (2)https://ww ...

  2. java中write方法报错_Java中管道报错:Write end dead

    今天看了下关于管道的通信,Java中的管道只能在同一进程的不同线程间通信.今天测试两个线程进行通信发现报错.下面是我测试的代码. package com.wpl.testIO; import java ...

  3. python selenium中析构方法报错sys.meta_path is None, Python is likely shutting down如何解决?

    在代码跑通之后编译器跟我说唉,你这析构中关闭的这个代码报错了然后就弹出了一堆的报错信息最后弹出来一个 ImportError: sys.meta_path is None, Python is lik ...

  4. MybatisPlus引用BaseMapper中的方法报错: BindingException: Invalid bound statement (not found):

    项目场景: 尝试使用Mybatis中的BaseMapper中的方法,代码如下: @Slf4j @Service public class PositionService {@AutowiredPosi ...

  5. Python调用seek(pos,mode)方法报错Can‘t do nonzero cur-relative seeks

    在Python中IO操作调用seek(pos,mode)方法时,出现异常错误:OSError:Can't do nonzero cur-relative seeks其示例代码如下: from io i ...

  6. 基于adversarial-robustness-toolbox(ART)包进行AI对抗攻击ZOO攻击方法报错

    基于adversarial-robustness-toolbox(ART)包进行AI对抗攻击ZOO攻击方法报错 环境 问题分析 问题解决 ZooAttack类使用扩展 环境 ART版本:1.14.0 ...

  7. getSupportFragmentManager().beginTransaction().add方法报错

    图中红线报错时,发现明明一样但是无论如何改都会报错,这时候就要注意Fragment文件的extends导入的方法,它可能是导入的包不对 如图所示,Fragment有两个包,如果导入的是Android. ...

  8. vue父组件调用子组件方法报错的解决方法

    vue父组件调用子组件方法报错 在父组件定义了一个tab标签页,每一个标签页下面都调用不同的组件,如下图所示: 子组件中定义的方法: setup() {const getList = () => ...

  9. java 实现接口后重写方法报错

    java 实现接口后重写方法报错 java 实现接口后重写方法报错 The method contextDestroyed(ServletContextEvent) of type InitListe ...

最新文章

  1. 字符串工具类、数组工具类、集合工具类、转型操作工具类、编码与解码操作工具类...
  2. vim 按照字段排序文件
  3. 黑马程序员--学习while、do-while、for循环、try-catch的用法
  4. typeset的常见用法
  5. 关于Android的应用程序的发布的学习(一)
  6. c#日期转换周几_C#获取每个年,月,周的起始日期和结束日期的方法
  7. 微信红包功能(含示例demo)
  8. ASP.NET事件顺序如下所示
  9. 10个高效的摸鱼神器,你错过几个?
  10. hfs网络文件服务器如何设置,hfs网络文件服务器的教程
  11. SuperMap iDesktop / iDesktopX 加载大疆智图(DJI Terra)导出的OSGB数据效果异常的绕行方案
  12. java4.25生成车牌号_泸牌16年涨882倍 超25万人拍一张车牌为哪般?
  13. Origin绘制热重TG和微分热重DTG曲线
  14. 硬盘:主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR解析
  15. paypal支付(Java)
  16. ①测定预测精度的方法【误差】—②组合模型【线性组合模型+最优线性组合模型+贝叶斯组合模型】
  17. 【活动更新】第一届Openbravo社区早餐会将与5/28在上海举办
  18. asa 防火墙拦截了https_ASA防火墙设置URL过滤
  19. 面向资源受限安全芯片的开放式运行环境设计
  20. 写给父亲的语音计算器(位图的加载,忽然领悟了资源编译器的加载c#,五)

热门文章

  1. 求数组的最大子数组和最大子数组的和
  2. java监听所有端口_(变强、变秃)Java从零开始之zookeeper安装
  3. 牛客华为机试第8题python
  4. 从源码分析DEARGUI之add_listbox
  5. 删除一个数的K位使原数变得最小
  6. 知识星球作业(第5周) - 关于view的知识
  7. python中try Except抛出异常使用方法
  8. 银行程序代发工资的方法
  9. thinkphp框架细节
  10. 在虚拟机上linux系统上上网