153
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
người dùng đóng cửa sổ chính bằng trình đơn hệ thống, và nó cho cơ hội ứng dụng thực hiện
việc tắt một cách bình thường.
CloseMainWindow
sẽ không kết thúc các ứng dụng không có cửa
sổ chính hoặc các ứng dụng có cửa sổ chính bị vô hiệu (có thể vì một hộp thoại hiện đang
được mở). Với những tình huống như thế,
CloseMainWindow
sẽ trả về
false
.
CloseMainWindow
trả về
true
nếu thông điệp được gửi thành công, nhưng không bảo đảm tiến
trình thật sự kết thúc. Ví dụ, các ứng dụng dùng để soạn thảo dữ liệu thường sẽ cho cơ hội
người dùng lưu lại các dữ liệu chưa được lưu nếu nhận được thông điệp này. Người dùng
thường có cơ hội hủy bỏ việc đóng cửa sổ với những tình huống như thế. Điều này nghĩa là
CloseMainWindow
sẽ trả về
true
, nhưng ứng dụng vẫn cứ chạy khi người dùng hủy bỏ. Bạn có
thể sử dụng phương thức
Process.WaitForExit
để báo hiệu việc kết thúc tiến trình và thuộc
tính
Process.HasExited
để kiểm tra tiến trình đã kết thúc hay chưa. Và bạn cũng có thể sử
dụng phương thức
Kill
.
Phương thức
Kill
kết thúc một tiến trình ngay lập tức; người dùng không có cơ hội dừng việc
kết thúc, và tất cả các dữ liệu chưa được lưu sẽ bị mất.
Kill
là tùy chọn duy nhất để kết thúc
các ứng dụng dựa-trên-Windows không đáp lại
CloseMainWindow
và để kết thúc các ứng dụng
không-dựa-trên-Windows.
Ví dụ dưới đây khởi chạy một thể hiện mới của Notepad, đợi 5 giây, sau đó kết thúc tiến trình
Notepad. Trước tiên, ví dụ này kết thúc tiến trình bằng
CloseMainWindow
. Nếu
CloseMainWindow
trả về
false
, hoặc tiến trình Notepad vẫn cứ chạy sau khi
CloseMainWindow
được gọi, ví dụ này sẽ gọi
Kill
và buộc tiến trình Notepad kết thúc; bạn có thể buộc
CloseMainWindow
trả về
false
bằng cách bỏ mặc hộp thoại File Open mở.
using System;
using System.Threading;
using System.Diagnostics;
public class TerminateProcessExample {
public static void Main () {
// Tạo một Process mới và chạy notepad.exe.
using (Process process = Process.Start("notepad.exe")) {
// Đợi 5 giây và kết thúc tiến trình Notepad.
Console.WriteLine("Waiting 5 seconds before terminating" +
" notepad.exe.");
Thread.Sleep(5000);
// Kết thúc tiến trình Notepad.
Console.WriteLine("Terminating Notepad with " +
"CloseMainWindow.");
// Gửi một thông điệp đến cửa sổ chính.