C# 与winform相比,控制台中的进程

C# 与winform相比,控制台中的进程,c#,winforms,delegates,C#,Winforms,Delegates,下面的控制台应用程序运行正常-我很惊讶它没有出错 class DelegateExperiments { //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //open notepad when the console b

下面的控制台应用程序运行正常-我很惊讶它没有出错

class DelegateExperiments
{

    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //open notepad when the console begins
    //create an event that fires and writes "Notepad closed" in the console
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    //instance variables of the form
    private const string helloText = "hello world";
    private const string exitText = "you just closed notepad";
    private Process myProcess;
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        


    static void Main(string[] args)
    {

        Console.WriteLine(helloText);

        DelegateExperiments myInstance;
        myInstance = new DelegateExperiments();
        myInstance.Foo();

        Console.Read();
    }

    void Foo()
    {

        myProcess = new Process();
        myProcess.StartInfo.FileName = @"notepad.exe";
        myProcess.Exited += MyProcessExited;
        myProcess.EnableRaisingEvents = true;
        //myProcess.SynchronizingObject = this;
        myProcess.Start();

    }

    private void MyProcessExited(Object source, EventArgs e)
    {
        Console.WriteLine(exitText);
    }


}
类委托实验
{
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//控制台启动时打开记事本
//创建在控制台中触发和写入“记事本已关闭”的事件
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//表单的实例变量
private const string helloText=“hello world”;
private const string exitText=“您刚刚关闭了记事本”;
私有进程myProcess;

// 在WinForms中,对UI元素的所有访问必须在专用UI线程上。请参阅第1.2.1节

正如文件所说:

当退出的事件由可视Windows窗体组件处理时, 例如按钮,通过系统线程访问组件 池可能无法工作,或可能导致异常。请通过 将SynchronizingObject设置为Windows窗体组件,这会导致 处理要在同一线程上调用的已退出事件的方法 在其上创建组件


Console
类是特意编写的线程安全类。您可以从任何线程调用它。它甚至可以确保不“重叠”来自不同线程的调用。
Console.Write/WriteLine
是原子的。这是因为Console设计为与shell交互,shell的一个主要用途是能够从多个过程中收集信息。让It部门能够做到这一点是一项相当大的工作,但它必须做到这一点,才能真正达到其目的


GUI对象(如标签)的设计并没有考虑到这一点。

问题是为什么GUI都需要从一个线程进行操作。实际上更具体的是——为什么需要设置myProcess.SynchronizingObject——我粘贴的引号解释了这会导致处理程序在与UI相同的线程上执行。你可以这样说答案太具体了,请继续。好吧,答案太具体了,没有给出任何有意义的见解,说明为什么GUI应用程序有UI线程而控制台应用程序没有“控制台”线程很重要。+1,即使写/写线不是原子的。即使是很长时间也不是。原子操作只是程序集操作ns:添加、Sub、Mov、Jz、Cmp等…如果你有一个打印“hello”的writeline,另一个打印“world”,你会得到“hello world”或“world hello”。你不会得到“HelloWorldlo”或者诸如此类。出于这个原因,你可以说,
Console.Write
是原子的。它不是固有的原子,它是原子的,因为锁或其他类似的机制被用来确保它是原子的。你可以有不止一个汇编操作是原子的。在这种情况下,他指的是线程。我说的是处理器wise、 。最重要的是,请看我的示例。如果我们假设该方法几乎同时从两个线程调用,那么从调用方的角度来看,它将显示为一个线程在另一个线程启动之前完整运行,并且它们不会混合。请看我在上一篇评论中给出的示例,了解这对Console.WriteLine的重要性“如果不是原子弹,那意味着什么呢?”约里纳森(很高兴你们两个吻了,和好了:))