为什么 WPF 的 Main 方法需要标记 STAThread 。
在编写 WPF 程序时,会发现 Main 方法上方会标记 [STAThread] 。

作用:STAThread 标记主线程,也就是 UI 线程是 STA 线程模型。
1 什么是 STA ?
与 STA(Single-Thread Apartment)对应的,是 MTA(Mutil-Thread Apartment),是 COM 组件中的概念,用于指示一个 COM 组件的线程模型。
详细可以参看:
多线程调用COM组件的体会(CoInitialize) - 庄园 - 博客园
关于COM组件线程模型的实验_晨星_新浪博客
关于 STA 与 MTA 的区别,可以参看:
C# Thread STA模式 与MTA模式 - 程序园
Difference between STA and MTA - Interview Questions
.net - Could you explain STA and MTA? - Stack Overflow
一个 STA 的 COM 组件,只能在 STA 线程模型下运行。
WPF 与 COM 组件
那,WPF 和 COM 组件又有什么关系?
WPF 是一套 Windows 下的 UI 框架,对 UI 的实现,可以理解为就是对 Win32 API 和 COM 组件的封装。(COM 组件是另一种 Windows API 的形式,可以理解为对 Win32 API 的封装。),
所以,如果 WPF 想要复用 COM 组件,就需要遵循 COM 组件的规则。用到了 STA 线程模型的 COM 组件,则线程也需要是 STA 模式。
如果没有标记,则线程默认是 MTA 模式。
WPF 的 UI 单线程
WPF 的 UI 是单线程的,直接跨线程访问 UI 元素会出现访问错误,可以使用 Dispatcher 进行封送 UI 操作,具体可以参看:Windows 消息循环(2) - WPF中的消息循环 。
除了与 COM 组件的关系,可以从另一个角度来理解,为什么 UI 线程会设计成单线程?
多线程会有资源访问的竞争问题,要处理处理这些问题,则需要完成大量线程同步的问题,即耗性能,也难以做到安全。
原文链接:
https://www.cnblogs.com/jasongrass/p/11885478.html
为什么 WPF 的 Main 方法需要标记 STAThread 。的更多相关文章
- WPF编译时提示“...不包含适合于入口点的静态‘Main’方法 ...”
今天看了一下wpf的Application类方面的知识,一个windows应用程序由一个Application类的实例表示,该类跟踪在应用程序中打开的所有窗口,决定何时关闭应用程序(属性 Shutdo ...
- WPF编译时提示"xxx不包含适合于入口点的静态 Main方法xxx"
WPF编译时提示"xxx不包含适合于入口点的静态 Main方法xxx"生成的时候一直报"xxx不包含适合于入口点的静态 Main 方法xxx" 看到这个问题首先 ...
- Main()方法
C#是从方法Main()开始执行的.这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void .虽然显式指定p山屺修饰符是很常见的,因为按照定义,必须在程序外部调用该方法,但我们给该入口 ...
- 如何为WPF添加Main()函数 程序入口点的修改
一般的.WPF的Main()函数是自动生成的,不过有时候我们需要为我们的应用程序传参.那么自动生成的Main()函数就不会满足我们的要求. 那么如何为WPF Application 设置Main()函 ...
- C# 方法与参数 常见命名空间汇总 using的使用 main方法参数
本文主要讲 C# 常见命名空间 using static 指令 && 调用静态方法 嵌套命名空间&&作用域 别名 Main() 方法 C# 常见命名空间 命名空间 作用 ...
- PCB Genesis脚本C#使用WPF窗体实现方法
用C#写脚本做UI界面基本上都是用WinForm界面,如果想制作很漂亮动态的界面用WPF界面挺不错的选择, 这里介绍如何使用控制台程序调用WPF窗口 一.方法一 在控制台程序中,通过Main方法启动W ...
- WPF 用Main函数方式启动程序
原文:WPF 用Main函数方式启动程序 WPF默认程序启动:新建project后自动生成的App.xaml中指定程序启动方式(StartupUri="MainWindow.xaml&quo ...
- [译]C# 7系列,Part 2: Async Main 异步Main方法
原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...
- 一个java文件中可包含多个main方法
java中的main方法是java应用程序的入口,java程序在运行时,首先调用执行main方法.但并不是说java中只能有一个main方法,不同类中都可以包含main方法.当JVM进行编译时,会提示 ...
随机推荐
- numpy-np.ceil,np.floor,np.expand_dims方法
np.ceil(多维数组):对多维数组的各个数向上取整 np.floor(多维数组):对多维数组的各个数向下取整 np.expand_dims(x,axis = 0):在x的第一维度上插入一个维度,a ...
- jQuery 源码解析(二十八) 样式操作模块 scrollLeft和scrollTop详解
scrollLeft和scrollTop用于获取/设置滚动条的,如下: scrollLeft(val) ;读取或设置整个页面的水平滚动条距离 scrollTop(val) ;读取或设置整个页面的垂直滚 ...
- 解决RubyMine中puts中文显示乱码的问题
一个简单的ruby代码,puts一个中文,显示乱码 # -*- coding: utf-8 -*- puts "你好" require_relative 'calc.rb' # r ...
- NFS文件系统及搭建NFS共享服务
一.什么是文件系统? 文件系统是对一个存储设备上的数据和元数据进行组织的一种机制.文件系统是在一个磁盘(包括光盘.软盘.闪盘及其它存储设备)或分区上组织文件方式方法,常见文件系统如ext2.ext3. ...
- JavaWeb中验证码校验的功能实现
后台生成验证码工具方法 /* * 设置图片的背景色 */ public static void setBackGround(Graphics g, int WIDTH, int HEIGHT) { / ...
- 周会材料:高并发程序设计<一>
第一章 几个概念 同步:一次方法调用须等到其返回后才能有后续 异步:一次方法调用后在另一线程执行,调用者可不必等其返回就可进行后续 并发:任务以极短的时间交替进行 并行:任务同时进行 临界区:公共资源 ...
- java简单实现用语音读txt文档
最近比较无聊,随便翻着博客,无意中看到了有的人用VBS读文本内容,也就是读几句中文,emmm,挺有趣的,实现也很简单,都不需要安装什么环境,直接新建txt文件,输入一些简单的vbs读文本的代码,然后将 ...
- 关于Java的多线程Runnable的个人理解(基础,不讲概念)
背景说明: 在学了Java的多线程(继承Thread,Runnable)以后,我出于好奇,就想知道java到底是不是多线程的,不能它说自己是多线程就是多线程,自己想验证一下,于是我就想测试一下,但继承 ...
- ckeditor5 使用第一天 下载并加载居中,居左,居右功能
官方网站地址https://ckeditor.com/,下载zip包或者从git上下载, 下载完成后解压文件,将文件复制到项目中 , 引用ckeditor.js,zh-cn.js路径到项目中, 初始化 ...
- jmeter控制器(三)
While Controllert当控制器: 当满足条件的情况下,就会执行控制器里面的脚本,首先我们设置线程组循环次数为10,如下图: 其次在配置元件中添加一个计数器,并设置从0到最大的10,每次递增 ...