欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C#各種結束進(jìn)程的方法詳細介紹

C#各種結束進(jìn)程的方法詳細介紹

Process類(lèi)的CloseMainWindow, Kill, Close

Process.CloseMainWindow是GUI程序的最友好結束方式,從名字上就可以看出來(lái)它是通過(guò)結束主窗體,相當于用戶(hù)點(diǎn)擊窗體的關(guān)閉按鈕或者按Alt + F4。它的本質(zhì)就是向主窗體發(fā)送WM_CLOSE消息(Process.MainWindowsHandle可以返回主窗體的句柄)。這個(gè)可以在.NET Framework源代碼中看出來(lái):

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消息

//向主窗體發(fā)送WM_CLOSE,注意是PostMessage而不是SendMessage

NativeMethods.PostMessage(newHandleRef(this, mainWindowHandle), 0x10, IntPtr.Zero, IntPtr.Zero);

returntrue;

}

 

CloseMainWindow方法使用PostMessage(不是SendMessage,所以消息會(huì )加在消息隊列的最后)方法向主窗體發(fā)送一個(gè)WM_CLOSE消息,這樣等主窗體處理完所有消息后,等遇到WM_CLOSE便開(kāi)始執行退出動(dòng)作。

比如記事本接到了WM_CLOSE消息但是有未保存的文件記事本會(huì )彈出對話(huà)框提示用戶(hù)保存還是不保存還是取消退出操作。Windows Forms和WPF的窗體都會(huì )有類(lèi)似操作,通過(guò)窗體的Closing事件來(lái)在WM_CLOSE消息接收后做出是否退出的決定。

 

之后我們會(huì )講到Windows Forms和WPF都有自己的友好型常規退出方式,但是其實(shí)有一個(gè)通用的GUI程序退出方式,就是利用這個(gè)CloseMainWindow方法:

//Windows Forms和WPF都可以用

//Windows Forms的Form.Closing事件會(huì )在之后發(fā)生

//WPF的Windows.Closing事件也會(huì )

Process.GetCurrentProcess().CloseMainWindow();

 

 

 

接下來(lái)就是Process.Kill方法,從名字也可以看出來(lái),直接殺掉,不給喘息喘息機會(huì )呵呵。Kill方法會(huì )直接結束整個(gè)進(jìn)程,不進(jìn)行常規資源清理(什么finally塊等……)。Kill本質(zhì)調用本地API:TerminateProcess函數。

 

 

最后一個(gè)是Process.Close方法。抱歉它根本不是用來(lái)結束進(jìn)程的!這個(gè)方法名字有些誤導,其實(shí)根本則不然。它僅僅是而是IDisposable的Dispose方法的具體執行,用來(lái)進(jìn)行Process類(lèi)的托管資源清理的!

由于Process類(lèi)繼承自Component類(lèi),后者繼承IDisposable而同時(shí)又有析構函數,而通過(guò)一個(gè)繼承類(lèi)可改寫(xiě)的Dispose方法(參數是bool disposing)來(lái)判斷這個(gè)Dispose是用戶(hù)調用還是GC調用。而這個(gè)Process.Close()方法正是用戶(hù)調用Dispose時(shí)進(jìn)行托管資源的清理方法:

下面Process.Dispose方法代碼:

protectedoverridevoid Dispose(bool disposing)

{

if (!this.disposed)

{

if (disposing)

{

//用戶(hù)調用,清理托管資源

this.Close();

}

this.disposed =true;

//調用Component的Dispose

base.Dispose(disposing);

}

}

 

這個(gè)Close方法類(lèi)似很多其他.NET中的類(lèi),比如Stream……因此Close肯定不會(huì )結束進(jìn)程,僅僅是Process類(lèi)作為IDisposable接口的間接繼承者的自我清理方法。

 

 

 

Environment類(lèi)的Exit和FailFast

Environment.Exit相當于在Main函數中的return指令。不過(guò)它不會(huì )執行代碼塊的finally塊(如果有的話(huà)),但資源清理還是要進(jìn)行的。

 

它是最常見(jiàn)的退出當前進(jìn)程的方法之一。在Main函數中我們可以直接return語(yǔ)句便退出了程序。如果不在Main函數內,那么Environment.Exit方法就可以派上用場(chǎng):

classa

{

~a()

{

Console.WriteLine("析構函數");

}

}

classProgram

{

staticvoid Main()

{

try

{

a oa =newa();

test();

}

finally

{

//這段代碼永遠不會(huì )執行

Console.WriteLine("finally");

}

}

 

staticvoid test()

{

Environment.Exit(0);

}

}

 

代碼將會(huì )輸出:

析構函數

看來(lái)GC調用了oa的析構函數,但注意finally塊沒(méi)有運行。

 

 

Environment.FailFast方法更速度,它甚至不需要向操作系統返回進(jìn)程退出代碼(ExitCode),直接結束當前進(jìn)程并在應用程序事件薄中寫(xiě)入信息,用于程序出現致命錯誤需要立即停止。

classa

{

~a()

{

Console.WriteLine("析構函數");

}

}

classProgram

{

staticvoid Main()

{

try

{

a oa =newa();

Environment.FailFast("致命錯誤發(fā)生!");

}

finally

{

//這段代碼永遠不會(huì )執行

Console.WriteLine("finally");

}

}

}

 

在.NET 4.0下,Environment.FailFast代碼會(huì )拋出FatalExecutionEngineError,而在4.0之前會(huì )拋出ExecutionEngineException。但都不會(huì )有任何輸出(GC沒(méi)有清理對象,同時(shí)finally塊也沒(méi)有運行)

 

 

 

 

WPF的Shutdown和Windows Forms的Exit

GUI程序往往都有自己的消息隊列和事件管理模式,因此結束一個(gè)GUI程序要遠復雜與結束一個(gè)控制臺程序。上述的方法中,Process.Kill和Environment.Exit和FailFast如果用在一個(gè)GUI程序中,都會(huì )直接強制結束整個(gè)程序,而不會(huì )激發(fā)GUI窗體的一些針對應用程序結束的事件(比如Closing事件)。而上面也講過(guò):Process.CloseMainWindow通過(guò)向主窗體發(fā)送一個(gè)WM_CLOSE消息可以很好的結束一個(gè)GUI程序,不過(guò)往往更自然的方法是利用GUI框架本身提供的結束程序的方法。

 

WPF中是System.Windows.Application.Shutdown方法,它其實(shí)就是在當前線(xiàn)程的消息隊列Dispatcher對象中加入一個(gè)正常優(yōu)先級(DispatcherPriority.Normal)的回調退出函數,等消息隊列最后處理到該項時(shí)程序開(kāi)始退出操作。通常這樣使用:

//或者App也可以,WPF程序默認會(huì )有一個(gè)App類(lèi)繼承Application類(lèi)

Application.Current.Shutdown();

 

 

Windows Forms中是:System.Windows.Forms.Application.Exit方法。它是通過(guò)Application.OpenFormsInternal屬性先把已經(jīng)打開(kāi)的窗體通過(guò)正常方式都關(guān)閉(運行Form.Closing事件),最后再結束整個(gè)應用程序進(jìn)程。

 

而且通過(guò)WPF的Window.Closing或Windows Forms的Form.Closing事件都可以取消這種形式的退出操作。

 

 

 

非托管的ExitProcess和TerminateProcess

這是Windows API中結束進(jìn)程的非托管方法。ExitProcess結束進(jìn)程更友好些,而TerminateProcess會(huì )立即強制結束進(jìn)程。兩者的關(guān)系有點(diǎn)像Environment.Exit和FailFast,但我不確定本質(zhì)上是否一樣。而且TerminateProcess可以指定進(jìn)程返回值,但FailFast不可以。兩個(gè)非托管API的執行都不回運行finally塊。

使用起來(lái)很簡(jiǎn)單(關(guān)鍵是P/Invoke,參考:http://www.pinvoke.net,很有用的)

using System.Runtime.InteropServices;

classProgram

{

[DllImport("kernel32.dll")]

staticexternvoid ExitProcess(uint uExitCode);

 

[DllImport("kernel32.dll", SetLastError =true)]

[return: MarshalAs(UnmanagedType.Bool)]

staticexternbool TerminateProcess(IntPtr hProcess, uint uExitCode);

 

staticvoid Main()

{

ExitProcess(1);

//或者

TerminateProcess(Process.GetCurrentProcess().Handle, 1);

}

}

 

 

 

 

手動(dòng)發(fā)送WM_CLOSE,WM_DESTROY,WM_QUIT消息

在一個(gè)GUI程序運行環(huán)境下,我們通過(guò)得到窗體的句柄,然后便可以向該句柄發(fā)送消息,WndProc(Window Procedure)函數會(huì )處理相應的事件。其中WM_CLOSE相當于用戶(hù)點(diǎn)擊關(guān)閉按鈕,使用PostMessage將WM_CLOSE發(fā)送至主窗體等價(jià)于.NET中Process類(lèi)的CloseMainWindow方法,當接收到WM_CLOSE消息時(shí),應用程序是可以選擇是否真正結束程序的,如果繼續結束程序而不取消。接著(zhù)WM_DESTROY消息會(huì )發(fā)送,這個(gè)消息代表著(zhù)窗體開(kāi)始真正關(guān)閉,此時(shí)可以進(jìn)行一些資源的清理。最后當前線(xiàn)程接收到WM_QUIT消息,線(xiàn)程的消息循環(huán)會(huì )被終止。

 

因此向窗體發(fā)送這3個(gè)消息,只有WM_CLOSE會(huì )引發(fā)Closing事件,屬于正常窗體退出邏輯,其他兩個(gè)中消息會(huì )直接強行關(guān)閉窗體。

注意WM_QUIT消息只能用PostMessage將其送至消息隊列尾部,使用SendMessage立即發(fā)送在WPF應用程序上運行后程序沒(méi)有任何反應。

 

下面是一個(gè)WPF程序發(fā)送下列消息,(并沒(méi)有貼XAML,你一定知道怎樣加3個(gè)按鈕然后把Click事件和窗體的Closing事件綁在代碼上吧)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

//外加命名空間

using System.Diagnostics;

using System.Runtime.InteropServices;

 

namespace Mgen.TEX

{

publicpartialclassMainWindow : Window

{

public MainWindow()

{

InitializeComponent();

}

 

//Windows消息值

constuint WM_CLOSE =0x10;

constuint WM_DESTROY =0x02;

constuint WM_QUIT =0x12;

 

//SendMessage和PostMessage的P/Invoke

[DllImport("user32.dll", CharSet =CharSet.Auto)]

staticexternIntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

 

[return: MarshalAs(UnmanagedType.Bool)]

[DllImport("user32.dll", SetLastError =true)]

staticexternbool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

 

//窗體的Closing事件,判斷Closing是否被運行

privatevoid Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

MessageBox.Show("Closing事件!");

}

 

//發(fā)送三種消息

privatevoid WM_CLOSE_Click(object sender, RoutedEventArgs e)

{

//也可以用PostMessage

SendMessage(Process.GetCurrentProcess().MainWindowHandle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

}

 

privatevoid WM_DESTROY_Click(object sender, RoutedEventArgs e)

{

//也可以用PostMessage

SendMessage(Process.GetCurrentProcess().MainWindowHandle, WM_DESTROY, IntPtr.Zero, IntPtr.Zero);

}

 

privatevoid WM_QUIT_Click(object sender, RoutedEventArgs e)

{

//只能使用PostMessage去將WM_QUIT送至消息隊列尾部

PostMessage(Process.GetCurrentProcess().MainWindowHandle, WM_QUIT, IntPtr.Zero, IntPtr.Zero);

}

 

}

}

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
WPF 下無(wú)邊框窗體改變大小和移動(dòng)
WPF中AllowsTransparency和WebBrowser兼容性問(wèn)題
c# 調用API訪(fǎng)問(wèn)其他窗體上的文本和執行單擊事件等等
c# 進(jìn)程間通信
在.NET中基于Windows消息的IPC實(shí)現
模擬鼠標發(fā)送點(diǎn)擊解決方法
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久