zoukankan      html  css  js  c++  java
  • C#一些不太熟悉的类——扩展学习

    Process.CloseMainWindow Method

    通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程。

    注解

    进程执行时,其消息循环处于等待状态。 每次操作系统将 Windows 消息发送到该进程时,消息循环都会执行。 调用CloseMainWindow将发送一个请求来关闭主窗口,该窗口在格式正确的应用程序中将关闭子窗口,并为应用程序撤消所有正在运行的消息循环。 通过调用CloseMainWindow退出进程的请求不会强制应用程序退出。 应用程序可以在退出前要求用户进行验证,也可以拒绝退出。 若要强制退出应用程序,请使用Kill方法。 的行为与CloseMainWindow用户使用系统菜单关闭应用程序的主窗口的行为相同。 因此,通过关闭主窗口来退出进程的请求不会强制立即退出。

    如果调用Kill,则由进程编辑的数据或分配给进程的资源可能会丢失。 Kill导致异常的进程终止,只应在必要时使用。 CloseMainWindow启用进程的有序终止,并关闭所有窗口,因此更适合使用接口的应用程序。 如果CloseMainWindow失败,可使用Kill终止进程。 Kill是终止没有图形界面的进程的唯一方法。

    只能为在Kill本地CloseMainWindow计算机上运行的进程调用和。 不能使远程计算机上的进程退出。 只能查看远程计算机上运行的进程的信息。

    ----------------------------------------------------------------

    Process.Start Method

    启动进程资源并将其与 Process 组件关联。

    地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.process.start?view=netframework-4.8

    注解

    使用此重载来启动进程资源,并将其与当前Process组件相关联。 返回值true指示已启动新的进程资源。 如果该FileName StartInfo属性的成员指定的进程资源已在计算机上运行,则不会启动其他进程资源。 相反,将重用正在运行的进程资源false并返回。

    可以通过指定最初安装应用程序的位置(例如,Web 地址)来启动 ClickOnce 应用程序。 不要通过在硬盘驱动器上指定其安装位置来启动 ClickOnce 应用程序。

    备注

    如果使用的是 Visual Studio,则Start方法的此重载是在Process将组件拖到设计器上后插入到代码中的方法。 使用窗口展开类别,并将适当FileName的值写入属性。 StartInfo Properties 您所做的更改将显示在InitializeComponent窗体的过程中。

    Start此重载static不是方法。 必须从Process类的实例调用它。 在调用Start之前,必须首先指定StartInfoProcess实例的属性信息,因为该信息用于确定要启动的进程资源。

    Start方法的其他重载是static成员。 在调用方法的重载之前,无需创建Process组件的实例。 相反,你可以Start Process为类本身调用,并在进程启动Process时创建新的组件。 如果重用null了进程,则返回或。 进程资源与Process Start方法返回的新组件自动关联。

    成员可用于复制 Windows Start菜单Run对话框的功能。 StartInfo 可以通过在StartInfo属性中设置相应的值来启动可键入到命令行中的任何内容。 必须设置StartInfo的唯一属性FileName是属性。 FileName属性不必是可执行文件。 它可以是其扩展插件与系统上安装的应用程序关联的任何文件类型。 例如,如果您FileName已将文本文件与一个编辑器(如记事本)关联,则该属性可以具有 .txt 扩展名; 如果您已将 .doc 文件与 word 处理工具(如 Microsoft word)关联,则该属性可能具有 .doc 扩展名。

    在命令行中,可以指定要对某些类型的文件执行的操作。 例如,可以打印文档或编辑文本文件。 使用Verb StartInfo属性的成员指定这些操作。 对于其他类型的文件,您可以在从Run对话框启动文件时指定命令行参数。 例如,如果将浏览器指定为FileName,则可以将 URL 作为参数传递。 可以在StartInfo Arguments属性成员中指定这些参数。

    如果在系统中使用引号声明了路径变量,则在启动在该位置找到的任何进程时必须完全限定该路径。 否则,系统将找不到该路径。 例如,如果c:mypath不在你的路径中,且你使用引号添加它: path = %path%;"c:mypath",则在启动时,你必须完全c:mypath限定中的任何进程。

    备注

    ASP.NET 网页和服务器控制代码在 Web 服务器上的 ASP.NET 工作进程上下文中执行。 如果在 ASP.NET 网页Start或服务器控件中使用方法,则新进程将在具有受限权限的 Web 服务器上执行。 该进程不会在与客户端浏览器相同的上下文中启动,也不能访问用户桌面。

    当你使用Start启动某个进程时,你可能需要将其关闭或丢失系统资源的风险。 使用CloseMainWindowKill关闭进程。 您可以使用其HasExited属性来检查进程是否已关闭。

    此处需要有关托管线程中的单元状态的说明。 UseShellExecute位于StartInfo main()进程组件的属性上时,请确保已通过设置方法上的属性[STAThread]设置了应用程序的线程模型。 true 否则,托管unknown线程可以处于状态或MTA处于状态,后者与UseShellExecute true发生冲突。 某些方法要求单元状态不为unknown如果未显式设置状态,则当应用程序遇到此类方法时,它默认为MTA,一旦设置,将无法更改单元状态。 但是, MTA当操作系统 shell 管理线程时,将导致引发异常。

    -----------------------------------------------

    文章:C#中[STAThread]的作用

    线程模型:线程模型是单线程单元

    是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。

    --------

    文章:.NET中STAThread和MTAThread

    组件对象的公寓模型只与创建该对象的线程有关

    创建组件对象应该在程序的主线程上,比如Main方法入口的地方,这样才能保证组件对象的公寓模型;

    --------

    文章:[STAThread]的含义

    以下是找到的一个资料介绍:
    Q. When I create a c# project from scratch in VS.NET, the generated code always have a [STAThread] attribute above the main routine. What does the STAThread attribute really do? Can I change it to MTAThread instead? I have searched website and books, no one seems to explain this well.

    Q.当我在VS.NET中从头开始创建c#项目时,生成的代码始终在主例程上方具有[STAThread]属性。 STAThread属性的作用是什么? 我可以改为将其更改为MTAThread吗? 我搜索过网站和书籍,似乎没人能很好地解释这一点。

    Asked by anon. Answered by the Wonk on February 17, 2003

    A.

    The STAThreadAttribute marks a thread to use the Single-Threaded COM Apartment if COM is needed. By default, .NET won't initialize COM at all. It's only when COM is needed, like when a COM object or COM Control is created or when drag 'n' drop is needed, that COM is initialized. When that happens, .NET calls the underlying CoInitializeEx function, which takes a flag indicating whether to join the thread to a multi-threaded or single-threaded apartment.

    如果需要COM,则STAThreadAttribute会将线程标记为使用单线程COM公寓。 默认情况下,.NET根本不会初始化COM。 仅当需要COM时(例如创建COM对象或COM Control或需要拖放'n'时),COM才会初始化。 发生这种情况时,.NET会调用基础CoInitializeEx函数,该函数带有一个标志,该标志指示是将线程加入多线程单元还是单线程单元。

    A multi-threaded apartment (MTA) in COM is more efficient, since any of a number of RPC threads from a pool can be used to handle a request. However, an object on the MTA thread needs to protect itself from multiple threads accessing it at the same time, so that efficiency comes at a cost.

    COM中的多线程单元(MTA)效率更高,因为可以使用池中的许多RPC线程中的任何一个来处理请求。 但是,MTA线程上的对象需要保护自己,以防止多个线程同时访问该对象,因此效率是有代价的。

    The single-thread apartment (STA) in COM is inherently single-threaded and therefore no additional thread synchronization is needed. The STA is implemented using the thread's Windows message queue, which is how requests to objects on an STA are serialized. Because of how the STA thread is implemented, calls to objects on that thread are serialized with Windows message handling on that thread, making sure that everything, both the COM objects and the underlying windowing objects, e.g. HWNDs, are all synchronized. This is necessary for UI-oriented COM objects, like controls and drag 'n' drop, which must also be synchronized together with the UI.

    COM中的单线程单元(STA)本质上是单线程的,因此不需要其他线程同步。 使用线程的Windows消息队列来实现STA,这是对STA上对象的请求进行序列化的方式。 由于STA线程的实现方式,对该线程上的对象的调用将通过该线程上的Windows消息处理进行序列化,以确保COM对象和基础窗口对象等所有内容(例如 HWND全部同步。 对于面向UI的COM对象(例如控件和拖放对象),这是必需的,这些对象也必须与UI同步。

    When COM is needed .NET will call CoInitializeEx, picking the MTA by default because it's more efficient. However, to get the synchronization needed for controls, windows and drag 'n' drop, you need to mark a thread's entry point with the STAThreadAttribute to let .NET know to initialize the UI thread on the STA. All of the VS.NET project templates put that attribute in to make sure you don't forget:

    当需要COM时,.NET将调用CoInitializeEx,默认情况下选择MTA,因为它效率更高。 但是,要获得控件,窗口和拖放“ n”所需的同步,您需要使用STAThreadAttribute标记线程的入口点,以使.NET知道在STA上初始化UI线程。 所有VS.NET项目模板都将该属性放入以确保您不会忘记:


    大致意思是:由于很多COM在.NET环境下如果使用多线程的话,会导致引用的COM不能正常运行,而如果不声明程序为STAThread的话,.NET就会自动使用多线程来提高效率,这样就会导致不可预知的后果。

    所以使用com组件时,需要考虑组件在多线程环境下是否能正常运行;

     -------------------------------------

    论坛上有人这样说:

    STAThread 指示一个应用程序的COM线程模型是单线程单元.

    使用 Windows 窗体的任何应用程序的入口点上必须存在此特性;
    1.如果没有此特性,则 Windows 组件可能无法正常工作。 
    2.如果不存在此特性,则应用程序将使用 Windows 窗体不支持的多线程单元模型

    应用程序框架的 Visual Basic 项目不必使用 STAThread 标记 Main 方法。因为Visual Basic 编译器会自动进行标记。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }

    winform窗体程序入口方法确实有这个特性:[STAThread]

    指示应用程序的COM线程模型是单线程的 公寓(STA)。

    STAThreadAttribute Class

    注解

    将此特性应用于入口点方法 (和Main() Visual Basic 中C#的方法)。 它不会影响其他方法。 若要设置在代码中启动的线程的单元状态, 请在Thread.SetApartmentState启动Thread.TrySetApartmentState线程之前使用或方法。

    微软地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.stathreadattribute?redirectedfrom=MSDN&view=netframework-4.8

    备注

    有关 COM 线程模型的概述, 请参阅了解和使用 Com 线程模型

    COM 线程模型仅适用于使用 COM 互操作的应用程序。 可以将 COM 线程模型设置为单线程单元或多线程单元。 仅当线程实际调用 COM 组件时, 才会为 COM 互操作初始化应用程序线程。 如果未使用 COM 互操作, 则不会初始化该线程, 并且STAThreadAttribute如果该属性存在, 则不会产生任何影响。

    从 .NET Framework 版本2.0 开始, COM 互操作的默认线程模型取决于你在开发应用程序时所用的语言, 如下表所示。

    微软有比较详细的解释,请阅读微软文档。

    -----------------------

    资料:https://docs.microsoft.com/en-us/previous-versions/ms809971(v=msdn.10)?redirectedfrom=MSDN

    标题:Understanding and Using COM Threading Models

  • 相关阅读:
    函数学习(JY07-JavaScript-JS基础03)
    数据类型转换中的一些特殊情况(JY06-JavaScript)
    JY05-JavsScript-JS基础01
    JY03-HTML/CSS-京东02
    JY02-HTML/CSS-京东01 定位是很粗暴的页面布局方法
    JY01-KX-01
    清浮动的几种方法
    HTML/CSS一些需要注意的基础知识
    linux 实时检测web项目MD5防止网站被黑
    面试总结第一谈
  • 原文地址:https://www.cnblogs.com/Tpf386/p/11583429.html
Copyright © 2011-2022 走看看