在编写 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. ubuntu 18.04多应用窗口切换的快捷键使用指南

    前记 使用ubuntu时间长了,很厌烦用鼠标来点来点去.重复操作的,还是快捷键比较方便.在多窗口切换方面,熟悉了几个快捷键之后,顿时感觉神清气爽.这里就推荐给大家学习一下,提高工作效率啊. 常用快捷键 ...

  2. Python 爬虫从入门到进阶之路(一)

    通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分.主要目的是将互联 ...

  3. 用户APC的执行过程

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 用户APC的执行过程 一.一个启发式问题 有一个问题,线程什么时候 ...

  4. C# 异步转同步 PushFrame

    异步转同步-PushFrame 本文通过PushFrame,实现异步转同步 首先有一个异步方法,如下异步任务延时2秒后,返回一个结果 private static async Task<stri ...

  5. Python中的常见特殊方法—— repr方法

    在Python中有些方法名.属性名的前后都添加了双下划线,这种方法.属性通常都属于Python的特殊方法和特殊属性,开发者可以通过重写这些方法或者直接调用这些方法来实现特殊的功能.其实前面见过的构造方 ...

  6. Python的小数据存储,用什么格式更有逼格?

    小数据存储 我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储.但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何 ...

  7. ASP.Net 连接多个数据库之间的切换

    本次两个的两个数据是SQL Server 和ORCAL 首先在Web.congfig中 <connectionStrings> </connectionStrings>里面添加 ...

  8. thinkphp 5.x No input file specified 解决

    原规则: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond ...

  9. EChart绘制风速风向曲线分析图

    1.获取ECharts 在 ECharts 的 GitHub 上下载最新的 release 版本,解压出来的文件夹里的 dist 目录里可以找到最新版本的 echarts 库. 2.引入ECharts ...

  10. [Linux] 获取出日志中的邮箱shell

    需求是把所有的日志中邮箱获取出来,根据指定关键字过滤,邮箱的格式是\txxx@xxx\t的格式,日志的存放是按照日期作为目录 #!/bin/bash logBasePath="/data1/ ...