当前位置:网站首页>C#(Winform) 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
C#(Winform) 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
2022-07-05 16:40:00 【coder i++】
转载:https://blog.csdn.net/qq_37508511/article/details/82770349
1、在主线程中实例化此ActiveX控件
2、将创建此Active控件的线程设定为单线程。
Thread.ApartmentState 获取或设置此线程的单元状态。
thread = new Thread(Mehtod);
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
或者线程池也可以
ThreadPool.QueueUserWorkItem(new WaitCallback(functionname),obj);
如果不在单线程单元中,那就声明为单线程单元
给Main函数加上[STAThread]
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
}
}
在 .NET Framework 1.0 版和 1.1 版中,ApartmentState 属性将线程标记为指示将在单线程单元或多线程单元中执行。当线程处于 Unstarted 或 Running 线程状态时,可以设置此属性;但一个线程只能设置此属性一次。如果尚未设置此属性,则它将返回 Unknown。
在 .NET Framework 2.0 版中,如果在启动新线程之前尚未设置它们的单元状态,则这些新线程将初始化为ApartmentState.MTA。默认情况下,主应用程序线程初始化为 ApartmentState.MTA。无法再通过在第一行代码上设置 System.Threading.ApartmentState 属性将主应用程序线程设置为 ApartmentState.STA。应改用 STAThreadAttribute。
在 .NET Framework 1.0 和 1.1 版中,可以通过使用 System.Threading.ApartmentState 属性在线程运行之后设置单元状态;这样会创建争用条件。在 .NET Framework 2.0 版中,这是不允许的。
COM 组件使用单元来同步对资源的访问。与之相对,托管对象使用同步区域、同步基元和同步上下文来确保以线程安全的方式使用所有共享资源,其中同步基元指互斥体、锁和完成端口等对象。有关 .NET 线程模型的其他信息,请参见托管线程处理。
为了实现互用性,公共语言运行库将在调用 COM 对象时创建一个单元并将其初始化。托管线程可以创建并进入只包含一个线程的单线程单元 (STA) 或包含一个或多个线程的多线程单元 (MTA)。当 COM 单元与线程所生成的单元兼容时,COM 将允许调用线程直接调用 COM 对象。如果这两种单元不兼容,COM 将创建一个兼容的单元并通过代理将所有调用封送在新的单元中。
运行库调用 CoInitializeEx 将 COM 单元初始化为 MTA 或 STA 单元。在 .NET Framework 2.0 版中,如果未在启动线程之前设置托管线程的单元状态,则托管线程会被初始化为 MTA。在启动线程之前可使用 SetApartmentState 或 TrySetApartmentState 方法设置单元状态。
在 .NET Framework 2.0 版中,除非将 STAThreadAttribute 应用于入口点过程,否则主应用程序线程会被初始化为 MTA。
下表将列出 ApartmentState 枚举值并显示可比的 COM 单元初始化调用。
ApartmentState 枚举值 | COM 单元初始化 |
---|---|
MTA | CoInitializeEx(NULL, COINIT_MULTITHREADED) |
STA | CoIntializeEx(NULL, COINIT_APARTMENTTHREADED) |
未知 | CoInitializeEx(NULL, COINIT_MULTITHREADED) |
边栏推荐
- How does the outer disk futures platform distinguish formal security?
- [wechat applet] read the life cycle and route jump of the applet
- [first lecture on robot coordinate system]
- Rider 设置选中单词侧边高亮,去除警告建议高亮
- WSL2.0安装
- composer安装报错:No composer.lock file present.
- [brush questions] effective Sudoku
- Learnopongl notes (II) - Lighting
- Practical example of propeller easydl: automatic scratch recognition of industrial parts
- Deeply cultivate 5g, and smart core continues to promote 5g applications
猜你喜欢
URP下Alpha从Gamma空间到Linner空间转换(二)——多Alpha贴图叠加
[61dctf]fm
7.Scala类
Embedded-c Language-2
兰空图床苹果快捷指令
【机器人坐标系第一讲】
采用药丸屏的iPhone14或引发中国消费者的热烈抢购
The two ways of domestic chip industry chain go hand in hand. ASML really panicked and increased cooperation on a large scale
Deeply cultivate 5g, and smart core continues to promote 5g applications
【Web攻防】WAF检测技术图谱
随机推荐
C language to get program running time
EasyX second lesson
Embedded UC (UNIX System Advanced Programming) -3
[wechat applet] read the life cycle and route jump of the applet
Copy mode DMA
flask解决CORS ERR 问题
Using C language to realize palindrome number
CMake教程Step6(添加自定义命令和生成文件)
调查显示传统数据安全工具面对勒索软件攻击的失败率高达 60%
Read the basic grammar of C language in one article
Iphone14 with pill screen may trigger a rush for Chinese consumers
Embedded-c Language-1
Jarvis OJ Telnet Protocol
ECU introduction
【beanshell】数据写入本地多种方法
编译libssh2报错找不到openssl
C# TCP如何限制单个客户端的访问流量
Excuse me, is the redis syntax used in DMS based on the commands of the redis community version of the cloud database
Is it safe to open futures accounts online? Will there be more liars online? Doesn't feel very reliable?
C# TCP如何设置心跳数据包,才显得优雅呢?