WinForm(一):开始一个WinForm程序

WinForm程序只能运行在Windows上,即使是基于.NET5,6,7也一样。因为WinForm的UI层对接的底层API是基于Windows的。

用VisualStudio创建一个WinForm应用很简单,建议使用非.NET Framework版,因为.NET Framework微软渐渐不支持了,即使出了bug。

f0d0f4ec4f141a67f357c6a6cfded5f7.png

本篇分享两个技术点,STAThreadAttribute和Application。

  • STAThreadAttribute

WinForm肯定是遵守从Main入口的,程序结构典型的C#程序的层次结构:命名空间->类型->方法

namespace WinFormDemo01
{internal static class Program{[STAThread]static void Main(){ApplicationConfiguration.Initialize();Application.Run(new Form1());}}
}

不一样的是[STAThread],这个特性在Main函数上面,也只有在这里会起作用。它完整写法是STAThreadAttribute,指示应用程序的 COM 线程模型是单线程单元 (STA)。

注:

COM( Component Object Model)组件对象模型 :定义了一个二进制互操作性标准,用于创建在运行时交互的可重用软件库。

Aparment叫套间:是线程模型概念的一个继承者,实现是一个结构而已。如查一个套间是STA,那么这个套间有且只有一个线程和其关联。

Single-threaded Apartments单线程套间:是COM提供的线程模型之一。

如果不声明STAThread会出现什么情况呢?假如在Form1上放一个按钮,按钮单击后执行下面的代码:

this.Text=(string?)Clipboard.GetDataObject()?.GetData(DataFormats.Text);

不声明STAThread就会报一个ThreadStateException类型的异常,Message是“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记”。因为剪切板是系统的,需要通过COM协议来访问,如果应用不是STA的,会限制对其访问。

  • Application

Main方法里有Application对象,这里可以看作是一个程序,或一个进程序,代表当前程序,第一行是配置的初始化,这个方法也是近期提升成一个方法,方法里是对WinForm可视化,应用渲染,高DPI的一些配置。第二行就是启动就用了,Run里的窗体就是主窗体,如果关闭主窗体程序会退出,或者调用Application.Exit(),应用也会退出。

Application,代表应用,它可以全局设置一些程序的信息,订阅一些应用的事件,比如主线程退出,应用退出,全局异常捕获等。同时还提供了一些方法,比如应用重启,和各种全局设置方法。

19c0e5c48ea072ea303a75396ccfb2cb.png

本篇只是简单介绍了两个技术点,一个是WinForm启动时,通过在Main方法添加特性STAThread来声明这是一个COM线程模型是单线程单元;另一个知识点是整个WinForm进程的管理是通过Application来完成的,进程的全局设置和管理,都应该找它来解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS微课1000例】0050:Geodatabase属性域操作全解

文章目录 1. 属性域的创建2. 属性域的查看3. 属性域的删除与修改4. 属性域的关联地理数据库按照面向对象的模型存储地理信息,也可以将其非空间信息保存在表中。对于要素和表可以设置一些规则进行限制,对属性的约束称为属性域。 属性域是描述字段合法值的规则,是一种增强数据…

『JavaScript』核心

为什么80%的码农都做不了架构师?>>> 弱类型语言 JavaScript是一种弱类型的语言。变量可以根据所赋的值改变类型。原始类型之间也可以进行类型转换。其弱类型的物质为其带来了极大的灵活性。 注意:原始类型使用值传递,复合类型使用…

优酷VIP会员周卡只需7.5元,看《沉香如屑》用优酷视频

由杨紫、成毅主演的《沉香如屑》已上线7天。站内热度值已经破万,也拿下了4次日冠的好成绩。追优酷视频最新热剧不能没有优酷VIP会员啊,优酷的会员,价格算是最便宜的了,下面是幻海优品优酷VIP会员特价充值的价格。优酷VIP会员特价充…

Solr6.1.0Windows安装步骤

一、 环境 solr 6.1.0 下载地址 http://archive.apache.org/dist/lucene/solr/6.1.0/ jdk 1.8 tomcat8 二、 安装solr到tomcat 1.解压solr,把 solr-6.1.0\solr-6.1.0\server 下的solr-webapp 文件夹拷贝到tomcat 的webapps下,重命名为solr;…

[转]Autofac 框架初识与应用

一、前言 这上一篇中,主要讲述了什么是IoC容器,以及了解到它是DI构造函注入的框架,它管理着依赖项的生命周期以及映射关系,同时也介绍实践了在ASP.Net Core中,默认提供的内置IoC容器,以及它的实例注册方式和相应的生命…

【ArcGIS微课1000例】0051:Geodatabase子类型操作全解

子类型是要素类中具有相同属性的要素的子集,或表中具有相同属性的对象的子集。可 通过它们对数据进行分类。 子类型是特征类(或对象类)中特征(或对象)的次级分类。例如一个公路线要素类可以根 据其字段类型的值细分为“高速公路”和“普通公路”两个子类型。 子类…

在Winform程序中设置管理员权限及为用户组添加写入权限

在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身份运行,或者设…

数据库性能系列之索引(上)

前言上一次,我们从优化子查询的角度,讲解了一些简单的数据库性能优化方面的知识。通过优化子查询的顺序,包括合理使用IN和EXISTS,可以起到部分查询的效率提升。但对于其他大多数场景,如单表记录很大,或多表…

【ArcGIS微课1000例】0052:创建地理数据库注记(标准注记、要素关联注记、尺寸注记)

本文讲述创建地理数据库注记(标准注记、要素关联注记、尺寸注记)的方法。 文章目录 一、创建标准注记二、创建与要素关联的注记三、创建尺寸注记一、创建标准注记 标准注记不与地理数据库中的要素关联。标准注记的一个例子是,地图上标记某山脉的文字,没有特定的要索代表该…

Lambda表达式超详解

目录 背景 Lambda表达式的用法 函数式接口 Lambda表达式的基本使用 语法精简 变量捕获 匿名内部类 匿名内部类中的变量捕获 Lambda的变量捕获 Lambda表达式在类集中的使用 Collection接口 List接口 Map接口 总结 背景 Lambda表达式是Java SE 8中的一个重要的新特性.…

【ArcGIS微课1000例】0043:ArcGIS绘制国界线的3种方法

本文讲解ArcGIS绘制国界线的3种方法。 文章目录 1. 直接修改国界线符号2. 缓冲区工具3. 制图表达1. 直接修改国界线符号 直接修改国界线/省界线的符号。点击“线要素”出现符号选择器,点击【编辑符号】按钮,编辑成下面右图的形式。缺点:只能在边界一侧出现缓冲样式,如下面…

C# 获取系统已安装的.NET版本

本文经原作者授权以原创方式二次分享,欢迎转载、分享。原文作者:唐宋元明清原文地址: https://www.cnblogs.com/kybs0/p/16478587.htmlC# 获取系统已安装的.NET版本获取系统已安装的.NET版本,来确定当前应用可运行的环境。获取系…

.NET 6 Minimal API 的经验分享

Minimal API 是 .NET 6 提供的最新功能 , 对比传统的 ASP.NET Core Web API 方式更加直接 , 你可以用几行代码编写好 REST API 。 没有了祖传的 Startup.cs 和 Controller ,通过简单的代码就可以完成 API 的开发。在第二阶段的 .NET 挑战赛中就以 .NET 6…

JavaWeb之Filter过滤器

原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼。言归正传,过滤器从字面理解她的话有拦网、过滤的功能,可以…

【ArcGIS微课1000例】0054:尺寸注记的创建与编辑

尺寸注记要素是一种特殊类型的文本,用于显示地图上的长度或距离,可以创建各种形状的尺寸注记要素,如对齐、简单对齐、水平线状、垂直线状和旋转线状等。 文章目录 一、创建尺寸注记1. 直接创建尺寸注记要素2. 通过已有尺寸注记要素创建二、编辑尺寸注记1. 删除尺寸注记要素2…

利用python实现批量查询ip地址归属地址

今天需要查询nginx访问的客户端ip是否和调度一样!先是用shell把文件中的ip截取出来: python脚本如下:(哈哈,新手写的很草率)#!/usr/bin/env#-- coding: utf-8 - import jsonimport urllibimport socketimpo…

基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

堪比JMeter的.Net压测工具 - Crank 入门篇

1. 前言 Crank 是.NET 团队用来运行基准测试的基准测试基础架构,包括(但不限于)来自TechEmpower Web 框架基准测试的场景,是2021年.NET Conf 大会上介绍的一项新的项目,其前身是Benchmarks。 Crank目标之一是为开发人员提供一种工…

【GlobalMapper精品教程】016:按照指定字段批量生成不同用地类型的矢量图层

Globalmapper中可以很方便的根据指定的字段,对矢量数据进行批量提取,生成不同类型的多个矢量数据,本文以土地利用现状数据为例,基于DLMC,提取出不同用地类型的矢量图层。 参考阅读:【ArcGIS遇上Python】ArcGIS Python按照指定字段批量筛选不同类型的图斑(以土地利用数据…