博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。...
阅读量:4963 次
发布时间:2019-06-12

本文共 1153 字,大约阅读时间需要 3 分钟。

本文转自 ; 原文:

参考自:http://www.cnblogs.com/winzheng/archive/2008/12/02/1345656.html

出错环境:

多线程接收文件的时候,需要打开一个SaveFileDialog对象,并调用ShowDialog()方法

出错代码:

void threadProc(){    ...    SaveFileDialog saveFileDlg = new SaveFileDialog();    if (saveFileDlg.ShowDialog() != DialogResult.OK)    {         /返回之后,recvThreadProc         return;    }    ...}
View Code

出现异常: 

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

出错原因:

确认了下,Main()函数之前确实有STAThreadAttribute标记,因此不是该问题,而是当前线程的问题!

[STAThread]        static void Main()        {}
View Code

 

据之前的了解,由于该操作在新创建的线程中执行,应该是不能访问UI的,也就是说直接调用ShowDialog()方法确实是有问题的。 

按照“多线程中安全的访问控件”一文中提到的方法的话,必须创建一个委托,然后异步调用该委托才可以

但是,异步调用委托的方法似乎比较麻烦...

既然问题是出在了“将当前线程设置为单线程单元(STA)模式”这块儿,所以就想着从这块入手

解决方法:

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

其中:

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

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

Unknown:尚未设置 ApartmentState 属性。

代码如下:

 
Thread recvThread=new Thread(new ParameterizedThreadStart(recvThreadProc));recvThread.SetApartmentState(ApartmentState.STA);recvThread.Start(commSock);
View Code

 

 

 

转载于:https://www.cnblogs.com/zjsjiangnan/p/3476285.html

你可能感兴趣的文章
Opencv+Zbar二维码识别(一维码校正)
查看>>
verilog中的for循环问题
查看>>
ssh-keygen -t rsa -C "your_email@example.com"
查看>>
关于WIN32.EXE变态木马下载器的解决办法
查看>>
jmeter非GUI模式如何压测并生成测试报告
查看>>
【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分/LCT+贪心
查看>>
自我介绍
查看>>
TICK/TIGK运维栈安装运行 docker【中】
查看>>
Android 插件化学习笔记
查看>>
jmeter常用插件安装
查看>>
MongoDB简介
查看>>
WebLogic12c 注册windows系统服务
查看>>
Oracle转换时间出现的问题:ORA-01810: format code appears twice
查看>>
ios UICollectionView实现瀑布流
查看>>
Angular创建路由从主界面跳转到我们的cesium界面
查看>>
猴子吃桃问题
查看>>
try-catch使用反思(-)
查看>>
.NET同一个页面父容器与子容器通信方案
查看>>
苹果开发——App内购以及验证store的收据(二)
查看>>
学习计划大纲
查看>>