本篇分享两个技术点,STAThreadAttribute和Application。
-
STAThreadAttribute
namespace WinFormDemo01
{
internal static class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
}
如果不声明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,代表应用,它可以全局设置一些程序的信息,订阅一些应用的事件,比如主线程退出,应用退出,全局异常捕获等。同时还提供了一些方法,比如应用重启,和各种全局设置方法。
本篇只是简单介绍了两个技术点,一个是WinForm启动时,通过在Main方法添加特性STAThread来声明这是一个COM线程模型是单线程单元;另一个知识点是整个WinForm进程的管理是通过Application来完成的,进程的全局设置和管理,都应该找它来解决。