在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。
程序之前运行正常,我只是在一个事件中定义了做了如下操作,程序抛出此异常
Code private void OnExportPlan(object sender, EventArgs e) {try {if (null != ExportPlan) { Cursor = Cursors.WaitCursor; saveFileDialog1.Filter = "(Excel2003).xls|*.xls|(Excel2007).xlsx|*.xlsx";if (DialogResult.OK == saveFileDialog1.ShowDialog()) { mExportFilePath = saveFileDialog1.FileName; Application.DoEvents(); ExportPlan(this, null); } } }finally { Cursor = Cursors.Default; } }
查看MSDN,有如下说明:
单元是进程内部具有相同线程访问要求的对象的逻辑容器。同一单元中的所有对象都可以接收从该单元中的任何线程发出的调用。.NET Framework 不使用单元,托管对象自己负责以线程安全的方式使用所有共享资源。
由于 COM 类使用单元,因此公共语言运行库需要在 COM interop 的情况下调用 COM 对象时创建并初始化一个单元。托管线程可以创建并进入只允许有一个线程的单线程单元 (STA) 或者包含一个或多个线程的多线程单元 (MTA)。通过将线程的 ApartmentState 属性设置为 ApartmentState 枚举值之一,可以控制所创建的单元的类型。由于给定线程只能初始化 COM 单元一次,因此在第一次调用非托管代码之后就不能更改单元类型。
成员定义:
STA:Thread 将创建并进入一个单线程单元。
MTA:Thread 将创建并进入一个多线程单元
Unknown:尚未设置 ApartmentState 属性。
解决办法两种:
1) 在Main入口添加STAThread的Attribute
Code[STAThread]static void Main()
2)
Code Thread app = new Thread(new ParameterizedThreadStart(ShowWindow)); app.ApartmentState = ApartmentState.STA; //也可以 Thread newThread = new Thread(new ThreadStart(ThreadMethod)); newThread.SetApartmentState(ApartmentState.MTA);
转载请注明原创地址:http://www.cnblogs.com/winzheng/archive/2008/12/02/1345656.html
例如:
Code static void Main() { Thread newThread = new Thread(new ThreadStart(ThreadMethod)); newThread.SetApartmentState(ApartmentState.MTA); // The following line is ignored since // ApartmentState can only be set once. newThread.SetApartmentState(ApartmentState.STA); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.ThreadState, newThread.ApartmentState); newThread.Start(); // Wait for newThread to start and go to sleep. Thread.Sleep(300);try {// This causes an exception since newThread is sleeping. newThread.SetApartmentState(ApartmentState.STA); }catch(ThreadStateException stateException) { Console.WriteLine("\n{0} caught:\n" +"Thread is not in the Unstarted or Running state.", stateException.GetType().Name); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.ThreadState, newThread.GetApartmentState()); } } static void ThreadMethod() { Thread.Sleep(1000); }
转载于:https://www.cnblogs.com/winzheng/archive/2008/12/02/1345656.html
在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式相关推荐
- Thread\Threading.Timer\Task中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”
在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 出错环境: 1.在Thread线程中,调用Show ...
- 异常错误:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
最近做一个蛋疼的东西就是C#调用windows API 来操作一个摄像头,自动处理一些东西.要用到剪切板复制 粘贴功能,即 Clipboard.SetDataObject(filedic, true) ...
- C#异常解决:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。
问题来源: 昨晚上在调试数据库大作业的时候,我在注册界面Register里点击"上传头像"这个linklabel时,程序出现了一个异常:在调用OLE之前,必须将当前线程设置为单线程 ...
- 类中调用界面ActiveX控件报错当前线程不在单线程单元中因此无法实例化 ActiveX 控件的解决办法...
解决办法是Form类中定义一个静态的ActiveX对象,在formload中将界面上的ActiveX对象赋值给新定义的对象,类中访问该静态对象即可. public static AxClientDri ...
- 【代码】使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应
import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concu ...
- 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态
介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...
- javascript 调用浏览器的打印方法。并设置打印为横向打印
最近做一个简单的打印功能,要使用JavaScript调用浏览器的打印功能.并设置打印为横向打印: 为了适应A4纸的宽和高这里设置: body{margin:0 auto; width: 1010px; ...
- java调用ole ie_ActiveX (.ocx)的写法,及在IE里调用
ActiveX组件编制与ASP接口应用 ActiveX ActiveX是Microsoft为了使开发人员能够把计算机桌面环境与构成Internet及其大量资源的环境集成起来,同时保护在Windows中 ...
- java调用ole ie_SWT中通过Automatioin的方式访问IE(升级版)
SWT中调用Automation的方式 这篇文章中我们介绍了SWT中通过Automation访问IE的方式,但是只是简单的URL导航,没有自动填表单.自动提交等功能.我们对其进行了升级,采用了新的操作 ...
最新文章
- Centos7 搭建 k8s 环境教程,一次性成功
- python学习3. 无重复字符的最长子串(滑动窗口)
- SpringCloud Config简介
- BZOJ 3720 [洛谷P2137] : Gty的妹子树
- php ismethod,结合php类三种属性说明is_callable和method_exists简单区别
- win10此电脑不见了_教程 | win10总提示“你要允许此应用对电脑的修改吗”,如何关闭?...
- jQuery中的ajax、jquery中ajax全局事件、load实现页面无刷新局部加载、ajax跨域请求jsonp、利用formData对象向服务端异步发送二进制数据,表单序列化(异步获取表单内容)
- java实现EXcel的RC地址变成常规地址
- 使用 Windows 7 VHD启动计算机
- 一个简单漂亮的Java博客系统
- 金蝶K3WISE无窗口登录
- FW/IDS/WAF/IPS的区别
- 定能解决No instances available for provider
- 北京轨道交通新机场线“无人驾驶” 最高时速160公里
- English语法_人称代词 - It
- 虚拟机安装python3_虚拟机如何安装python
- 三星GalaxyTab3 7.0(WIFI) SM-T210 刷机 ROM 教程 附带港版官方ROM
- hdu 4607 Park Visit(树上最长链)
- 第九周.02.KAT
- 3.2 二维随机变量的边缘分布