C# 退出过程是那个函数

我定义了一个过程private void ??(){}
想跳出这个过程中该怎么写

第1个回答  2016-01-03
Process类的CloseMainWindow, Kill, Close
Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过结束主窗体,相当于用户点击窗体的关闭按钮或者按Alt + F4。它的本质就是向主窗体发送WM_CLOSE消息(Process.MainWindowsHandle可以返回主窗体的句柄)。这个可以在.NET Framework源代码中看出来:
publicbool CloseMainWindow()
{
IntPtr mainWindowHandle =this.MainWindowHandle;
//句柄是否为0
if (mainWindowHandle ==IntPtr.Zero)
{
returnfalse;
}
//GetWindowLong是否成功执行
if ((NativeMethods.GetWindowLong(newHandleRef(this, mainWindowHandle), -16) &0x8000000) !=0)
{
returnfalse;
}
//0x10 是 WM_CLOSE消息
//向主窗体发送WM_CLOSE,注意是PostMessage而不是SendMessage
NativeMethods.PostMessage(newHandleRef(this, mainWindowHandle), 0x10, IntPtr.Zero, IntPtr.Zero);
returntrue;
}

CloseMainWindow方法使用PostMessage(不是SendMessage,所以消息会加在消息队列的最后)方法向主窗体发送一个WM_CLOSE消息,这样等主窗体处理完所有消息后,等遇到WM_CLOSE便开始执行退出动作。
比如记事本接到了WM_CLOSE消息但是有未保存的文件记事本会弹出对话框提示用户保存还是不保存还是取消退出操作。Windows Forms和WPF的窗体都会有类似操作,通过窗体的Closing事件来在WM_CLOSE消息接收后做出是否退出的决定。

之后我们会讲到Windows Forms和WPF都有自己的友好型常规退出方式,但是其实有一个通用的GUI程序退出方式,就是利用这个CloseMainWindow方法:
//Windows Forms和WPF都可以用
//Windows Forms的Form.Closing事件会在之后发生
//WPF的Windows.Closing事件也会
Process.GetCurrentProcess().CloseMainWindow();

接下来就是Process.Kill方法,从名字也可以看出来,直接杀掉,不给喘息喘息机会呵呵。Kill方法会直接结束整个进程,不进行常规资源清理(什么finally块等……)。Kill本质调用本地API:TerminateProcess函数。

最后一个是Process.Close方法。抱歉它根本不是用来结束进程的!这个方法名字有些误导,其实根本则不然。它仅仅是而是IDisposable的Dispose方法的具体执行,用来进行Process类的托管资源清理的!
由于Process类继承自Component类,后者继承IDisposable而同时又有析构函数,而通过一个继承类可改写的Dispose方法(参数是bool disposing)来判断这个Dispose是用户调用还是GC调用。而这个Process.Close()方法正是用户调用Dispose时进行托管资源的清理方法:
下面Process.Dispose方法代码:
protectedoverridevoid Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
//用户调用,清理托管资源
this.Close();
}
this.disposed =true;
//调用Component的Dispose
base.Dispose(disposing);
}
}

这个Close方法类似很多其他.NET中的类,比如Stream……因此Close肯定不会结束进程,仅仅是Process类作为IDisposable接口的间接继承者的自我清理方法。

Environment类的Exit和FailFast
Environment.Exit相当于在Main函数中的return指令。不过它不会执行代码块的finally块(如果有的话),但资源清理还是要进行的。

它是最常见的退出当前进程的方法之一。在Main函数中我们可以直接return语句便退出了程序。如果不在Main函数内,那么Environment.Exit方法就可以派上用场:
classa
{
~a()
{
Console.WriteLine("析构函数");
}
}
classProgram
{
staticvoid Main()
{
try
{
a oa =newa();
test();
}
finally
{
//这段代码永远不会执行
Console.WriteLine("finally");
}
}

staticvoid test()
{
Environment.Exit(0);
}
}

代码将会输出:
析构函数
看来GC调用了oa的析构函数,但注意finally块没有运行。

Environment.FailFast方法更速度,它甚至不需要向操作系统返回进程退出代码(ExitCode),直接结束当前进程并在应用程序事件薄中写入信息,用于程序出现致命错误需要立即停止。
classa
{
~a()
{
Console.WriteLine("析构函数");
}
}
classProgram
{
staticvoid Main()
{
try
{
a oa =newa();
Environment.FailFast("致命错误发生!");
}
finally
{
//这段代码永远不会执行
Console.WriteLine("finally");
}
}
}

在.NET 4.0下,Environment.FailFast代码会抛出FatalExecutionEngineError,而在4.0之前会抛出ExecutionEngineException。但都不会有任何输出(GC没有清理对象,同时finally块也没有运行)
第2个回答  2009-07-04
return;本回答被提问者采纳

C#NET中退出过程是什么语句
退出循环:break;强行退出过程\/函数;return; 就像VB.Net中的Exit Sub一样的语句.退出应用程序:Application.Exit();continue不是用来退出循环的,是强制性的使循环体进入下一次符合条件的循环

在ASP.NET(C#)中,return的作用是什么,是退出当前过程,还是退出网页的所 ...
当你的函数类型是void时,也就是表示无返回类型,那么return表示的意义是退出该函数,返回调用该函数的那部分代码。但是当你的函数类型是int, double等时,那么return返回的值也要对应,例如一个int类型的函数,那么你在return时就应该return parm; 此时这个parm的类型必须是int型的,其他同理,那么return...

c#调试状态下的无故退出
我也用。net 2008 c#,遇到过目录变量程序退出的情况,你可以参考。

C#.net中,如何退出一个命令按钮的单击过程
private void button1_Click(object sender, System.EventArgs e){ ...\/\/想在中间某个位置退出,该使用哪个关键字?return;\/\/加这个就退出了 ...}

c#一个简单问题,关于登陆界面
\/\/\/ 构造函数 \/\/\/ \/\/\/ 数据库连接字符串 private DataBaseEngine( string strConfigString ) { \/\/ \/\/ TODO: 在此处添加构造函数逻辑 \/\/ strConn = strConfigString; } \/\/\/ \/\/\/ 返回全局唯一的DataBaseEngine对象用于访问数据库 \/\/\/ \/\/\/ <returns><\/returns> public static DataBaseEngine Create...

求C#高手帮忙。我想定义一个变量,适用于整个程序,请问怎么设置?在哪 ...
简单一点的实现,你可以定义一个类,比如 GlobalVar.cs 然后将你要定义的全局变量放到这个类里,用public static 类型 变量名 调用的时候 GlobalVar.变量名 调用就可以了,同样一些工具方法也可以写到一个工具类中 GLobalUtil.cs 方法也用Public static修饰就可以了 ...

在Visual C# 2005中如何实现窗口任意处移动窗口?
if (m.Result == (IntPtr)HTCLIENT)\/\/如果返回的是HTCLIENT { m.Result = (IntPtr)HTCAPTION;\/\/把它改为HTCAPTION return;\/\/直接返回退出方法 } break;} base.WndProc(ref m);\/\/如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理 } \/\/用后面这个重写的方法有个问题~~~...

static int
因为static变量也就是静态变量,在程序运行过程中被声明后就会一直保存在内存里,所以只能声明一次,第二次再访问那个函数时,给静态变量声明同时赋值的语句就不再执行了,而静态变量的值始终保存在内存里,也就是上次改变以后的值。没有static修饰的函数中的变量,只在函数被执行时占用内存,函数执行完毕后...

C语言程序重复执行的语句
例如:include<stdio.h> intmain(void){ charc;c=getchar();while(c!='')\/\/输入空格退出 { printf("%c",c);\/\/这里改成你需要的那个函数做相应的工作就可以了 c=getchar();} return0;}

软件工程设计师 C#、ASP.NET开发面试一般都会笔试和面试哪些题目,谢谢...
run()方法可以产生必须退出的标志来停止一个线程。 40. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 41. 构造器Constructor是否可被override...

相似回答