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的重要性“如果不是原子弹,那意味着什么呢?”约里纳森(很高兴你们两个吻了,和好了:))