2012-12-19 14 views
48

Khi tôi bắt đầu quá trình và muốn đóng quá trình này, sự khác nhau giữa Process.Close()Process.Kill() là gì?Sự khác biệt giữa quá trình giết và quy trình đóng là gì?

Tôi hỏi vì tôi có một ứng dụng bắt đầu chụp gói bằng Wireshark với lệnh thông qua dòng lệnh với Windows = hidden. vì vậy khi tôi muốn dừng chụp, tôi sẽ hủy quá trình này. Đôi khi việc chụp hình mở ra với lỗi mà gói tin cuối cùng bị cắt ở giữa nên tôi tự hỏi có thể sử dụng close() trước khi kill() giải quyết vấn đề này không?

Khi bắt đầu chụp, tôi có thể đóng bằng cách nhấn Ctrl + C nhưng trong trường hợp của tôi, tôi mở cửa sổ ở trạng thái ẩn, Tôi có thể làm điều gì đó tương tự thông qua mã của tôi không?

+2

http://stackoverflow.com/questions/673031/process-close-is-not-terminating-created-process-c –

Trả lời

50

Sự khác nhau giữa Process.Close()process.Kill() là gì?

Sổ tay là khá rõ ràng về điều đó:

Process.Close():

Phương pháp Đóng gây quá trình ngừng chờ đợi lối ra nếu nó được chờ đợi, đóng quá trình xử lý và xóa trình đặc tính riêng. Đóng không đóng đầu ra tiêu chuẩn, đầu vào, và người đọc lỗi và các nhà văn trong trường hợp chúng đang được tham chiếu bên ngoài. [I E. quá trình tự nó giữ chạy, bạn chỉ không thể kiểm soát được nữa sử dụng Process dụ của bạn]

Process.Kill():

Kill buộc chấm dứt của quá trình, trong khi CloseMainWindow chỉ yêu cầu một kết thúc. [...] Yêu cầu thoát khỏi quá trình bằng cách gọi CloseMainWindow không buộc ứng dụng phải thoát. Ứng dụng có thể yêu cầu xác minh người dùng trước khi thoát hoặc có thể từ chối thoát. Để buộc ứng dụng thoát, hãy sử dụng phương thức Kill. Hành vi của CloseMainWindow giống với hành vi của người dùng đóng cửa sổ chính của ứng dụng bằng menu hệ thống. Do đó, yêu cầu thoát khỏi quá trình bằng cách đóng cửa sổ chính không buộc ứng dụng phải thoát ngay lập tức.

Process.CloseMainWindow:

Đóng một quá trình mà có một giao diện người dùng bằng cách gửi một thông điệp gần cửa sổ chính của nó.


Đối với chỉnh sửa của bạn:

tôi hỏi, vì tôi có ứng dụng người bắt đầu để nắm bắt gói tin sử dụng Wireshark với lệnh thông qua dòng lệnh với Windows = ẩn.

Use the WinPcap API hoặc Pcap.Net library for that, không phải Wireshark.

+0

khi tôi bắt đầu chụp tôi có thể đóng nó bằng cách nhấn Ctrl + C nhưng trong trường hợp của tôi tôi mở cửa sổ trong trạng thái ẩn, tôi có thể làm điều gì đó với điều này? – user1710944

+0

@ user1710944 Tôi không hiểu bình luận của bạn, nhưng bạn thực sự nên nhìn vào API WinPcap. Các chương trình đang chạy trong các cửa sổ ẩn không thực sự là cách được khuyến nghị để tiêu thụ logic và dữ liệu của chúng, đó là những gì API dành cho. – CodeCaster

10

Kill yêu cầu hệ thống để hủy kết nối quá trình một cách vô thức (thông qua cuộc gọi đến cuộc gọi hệ thống Windows TerminateProcess). Điều này tương tự như End Process trong Task Manager.

Close đóng chốt xử lý cho quy trình trong .NET nhưng không thực sự chạm vào quy trình. Close cũng được gọi là Dispose. Xem this answer bởi Jon Skeet.

Tùy chọn thứ ba là CloseMainWindow, trong đó làm tắt chương trình bằng cách yêu cầu đóng cửa sổ chính. Điều này giống như việc nhấp chuột phải vào chương trình trên thanh tác vụ và chọn Đóng.

+0

Tất nhiên CloseMainWindow sẽ chỉ chấm dứt việc áp dụng nếu ứng dụng được thiết lập để chấm dứt khi cửa sổ chính của nó bị đóng. –

4

Giết và đóng không phải là hai tùy chọn. Kill (hoặc CloseMainWindow) phải được gọi nếu bạn muốn chấm dứt một quá trình. Việc gọi Close sẽ chỉ là tài nguyên miễn phí, nhưng nó sẽ không đóng các luồng chuẩn. Tự mình đóng các luồng có thể hoặc không thể khiến quá trình kết thúc, nó phụ thuộc vào quy trình. Chiến lược tốt nhất là gọi Kill hoặc CloseMainWindow tùy thuộc vào loại process và sau đó Dispose the Process object.

Close bắt đầu đóng đối tượng Quy trình. Nó được gọi là Vứt bỏ. Close thường được sử dụng để quản lý tài nguyên của đối tượng Process.

Kill chấm dứt quy trình. Đây là cách duy nhất để chấm dứt một quá trình không có giao diện người dùng.

CloseMainWindow gửi thư gần đến cửa sổ chính của quy trình. Đây là cách duyên dáng để ngăn chặn một quá trình có giao diện người dùng.

2

Hãy để tôi minh họa điều xảy ra trực quan khi bạn gọi Đóng() và Kill(). Sau đây sẽ mở Notepad nhưng không thoát khỏi notepad ở cuối khi myProcess.Close() thực thi.

Process myProcess; 
myProcess = Process.Start("Notepad.exe"); 
Thread.Sleep(10000); 
myProcess.Close(); 

mục sau sẽ mở Notepad. sau 10 giây notepad sẽ đóng vào cuối khi myProcess.Kill() thực thi.

Process myProcess; 
myProcess = Process.Start("Notepad.exe"); 
Thread.Sleep(10000); 
myProcess.Kill();