在编写 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 。的更多相关文章

  1. WPF编译时提示“...不包含适合于入口点的静态‘Main’方法 ...”

    今天看了一下wpf的Application类方面的知识,一个windows应用程序由一个Application类的实例表示,该类跟踪在应用程序中打开的所有窗口,决定何时关闭应用程序(属性 Shutdo ...

  2. WPF编译时提示"xxx不包含适合于入口点的静态 Main方法xxx"

    WPF编译时提示"xxx不包含适合于入口点的静态 Main方法xxx"生成的时候一直报"xxx不包含适合于入口点的静态 Main 方法xxx" 看到这个问题首先 ...

  3. Main()方法

    C#是从方法Main()开始执行的.这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void .虽然显式指定p山屺修饰符是很常见的,因为按照定义,必须在程序外部调用该方法,但我们给该入口 ...

  4. 如何为WPF添加Main()函数 程序入口点的修改

    一般的.WPF的Main()函数是自动生成的,不过有时候我们需要为我们的应用程序传参.那么自动生成的Main()函数就不会满足我们的要求. 那么如何为WPF Application 设置Main()函 ...

  5. C# 方法与参数 常见命名空间汇总 using的使用 main方法参数

    本文主要讲 C# 常见命名空间 using static 指令 && 调用静态方法 嵌套命名空间&&作用域 别名 Main() 方法 C# 常见命名空间 命名空间 作用 ...

  6. PCB Genesis脚本C#使用WPF窗体实现方法

    用C#写脚本做UI界面基本上都是用WinForm界面,如果想制作很漂亮动态的界面用WPF界面挺不错的选择, 这里介绍如何使用控制台程序调用WPF窗口 一.方法一 在控制台程序中,通过Main方法启动W ...

  7. WPF 用Main函数方式启动程序

    原文:WPF 用Main函数方式启动程序 WPF默认程序启动:新建project后自动生成的App.xaml中指定程序启动方式(StartupUri="MainWindow.xaml&quo ...

  8. [译]C# 7系列,Part 2: Async Main 异步Main方法

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...

  9. 一个java文件中可包含多个main方法

    java中的main方法是java应用程序的入口,java程序在运行时,首先调用执行main方法.但并不是说java中只能有一个main方法,不同类中都可以包含main方法.当JVM进行编译时,会提示 ...

随机推荐

  1. IT兄弟连 HTML5教程 多媒体应用 HTML图像地图

    图像地图是带有可点击区域的图像,通常情况下,每个区域是一个相关的超级链接.点击某个区域,就会到达相关的链接,也可以通过图像地图实现图片切换效果. 1  什么是图像地图 把一幅图像分成为多个区域,每个区 ...

  2. 用Go写完Hello World,一些需要注意的地方

    序言 Go可是说是近几年比较火的语言了,目前版本已经到了1.13,如果说有其他语言的基础,学习Go还是挺简单的.这篇文章主要是总结一些,和其他语言可能会不一样的地方. 多返回值 之前如果一个方法像返回 ...

  3. Python 接口自动化常用方法封装

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/ ...

  4. mysql的repeat()函数

    用来复制字符串,如下'ab'表示要复制的字符串,2表示复制的份数 mysql> select repeat('ab',2); +----------------+ | repeat('ab',2 ...

  5. Thymeleaf对象的使用:日期对象

    Thymeleaf在模板中使用 #dates 或 #calendars 两个对象来处理日期,这两个对象大部分类似. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2 ...

  6. 基于C# 调用百度AI 人脸识别

    一.设置 登录百度云控制台,添加应用-添加人脸识别,查找,对比等. 记住API Key和Secret Key 二.创建Demo程序 1.使用Nuget安装 Baidu.AI 和 Newtonsoft. ...

  7. 37-Data Volume 之 bind mount

    storage driver 和 data volume 是容器存放数据的两种方式,上一节我们学习了 storage driver,本节开始讨论 Data Volume. Data Volume 本质 ...

  8. 小程序npm(初级篇)

    小程序npm NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NP ...

  9. 使用scale等比例缩放图片

    功能需求: 在下拉框中选择你所需要缩放的比例, 选择好了之后,图片会按照你选择的比例进行缩放 1==>如何获取select中option选中的值 在select添加事件change 和双向绑定v ...

  10. Educational Codeforces Round 73 (Rated for Div. 2)

    传送门 A. 2048 Game 乱搞即可. Code #include <bits/stdc++.h> #define MP make_pair #define fi first #de ...