Phương thức Start của đối tượngQuy trình có thể là một trong những công cụ được đánh giá thấp nhất dành cho lập trình viên. Như một . NET , Start có một số tình trạng quá tải, là các bộ tham số khác nhau xác định chính xác chức năng của phương thức. Quá tải cho phép bạn chỉ định hầu hết mọi bộ tham số mà bạn muốn chuyển sang quy trình khác khi nó bắt đầu.
Những gì bạn có thể làm với Process.Start thực sự chỉ bị giới hạn bởi các quy trình bạn có thể sử dụng với nó. Nếu bạn muốn hiển thị readme dựa trên văn bản của mình trong Notepad, thật dễ dàng như sau:
Process.Start("Readme.txt")
Process.Start("notepad", "ReadMe.txt")
Ví dụ này giả định rằng tệp readme nằm trong cùng thư mục với chương trình và Notepad là ứng dụng mặc định cho các loại tệp .txt và nằm trong đường dẫn môi trường hệ thống.
Process.Start tương tự lệnh shell trong VB6
Đối với các lập trình viên quen thuộc với Visual Basic 6, Process.Start giống như lệnh VB 6 Shell . Trong VB 6, bạn sẽ sử dụng một cái gì đó như:
lngPID = Shell("MyTextFile.txt", vbNormalFocus)
Sử dụng Process.Start
Bạn có thể sử dụng mã này để bắt đầu tối đa hóa Notepad và tạo một đối tượng ProcessStartInfo mà bạn có thể sử dụng để kiểm soát tốt hơn:
Làm mờ ProcessProperties dưới dạng mới ProcessStartInfo
ProcessProperties.FileName = "notepad"
ProcessProperties.Arguments = "myTextFile.txt"
ProcessProperties.WindowStyle = ProcessWindowStyle.Maximized
Làm mờ myProcess As Process = Process.Start(ProcessProperties)
Bắt đầu một quá trình ẩn
Bạn thậm chí có thể bắt đầu một quá trình ẩn.
ProcessProperties.WindowStyle = ProcessWindowStyle.Hidden
Truy xuất tên của một quá trình
Làm việc với Process.Start như một đối tượng .NET cung cấp cho bạn nhiều khả năng. Ví dụ: bạn có thể truy xuất tên của quy trình đã được bắt đầu. Mã này sẽ hiển thị “notepad” trong cửa sổ đầu ra:
Dim myProcess As Process = Process.Start("MyTextFile.txt") Console.WriteLine(myProcess.ProcessName)
Đây là điều bạn không thể thực hiện với lệnh VB6 Shell vì nó khởi chạy ứng dụng mới một cách không đồng bộ. Sử dụng WaitForExit có thể gây ra sự cố đảo ngược trong .NET vì bạn phải bắt đầu một quy trình trên một luồng mới nếu bạn cần nó chạy không đồng bộ. Ví dụ: nếu bạn cần các thành phần tồn tại trên một biểu mẫu nơi quy trình được bắt đầu và WaitForExit
Một cách để buộc quá trình dừng lại là sử dụng phương thức Kill .
myProcess.Kill()
Mã này đợi mười giây rồi kết thúc quá trình.
Tuy nhiên, đôi khi một sự chậm trễ bắt buộc là cần thiết để cho phép quá trình hoàn thành đầu ra để tránh lỗi.
myProcess.WaitForExit(10000)
' nếu quá trình không hoàn tất trong
vòng ' 10 giây,
hủy nó Nếu không phải myProcess.HasExited Sau đó
myProcess.Kill()
Kết thúc Nếu
Threading.Thread.Sleep(1)
Console.WriteLine("Notepad đã kết thúc: " _
& myProcess.ExitTime & _
Môi trường.NewLine & _
"Mã Thoát: " & _
myProcess.ExitCode)
Trong hầu hết các trường hợp, có lẽ nên đặt quá trình xử lý của bạn vào một khối sử dụng để đảm bảo rằng các tài nguyên mà quá trình sử dụng được giải phóng.
Sử dụng myProcess As Process = New Process
' Mã của bạn ở đây
Kết thúc Sử dụng
Để làm cho tất cả những điều này trở nên dễ dàng hơn, thậm chí còn có một thành phần điện toán mà bạn có thể thêm vào dự án của mình để bạn có thể thực hiện nhiều việc được trình bày ở trên tại thời điểm thiết kế thay vì thời gian chạy.
Một trong những điều khiến điều này trở nên dễ dàng hơn rất nhiều là việc mã hóa các sự kiện do quy trình tạo ra, chẳng hạn như sự kiện khi quy trình kết thúc. Bạn cũng có thể thêm bộ điều khiển bằng mã như sau:
' Cho phép quy trình tăng sự kiện
myProcess.EnableRaisingEvents = True
' Thêm
trình xử lý sự kiện đã thoát AddHandler myProcess.Exited, _
AddressOf Me.ProcessExited
Private Sub ProcessExited(ByVal sender As Object, _
ByVal e As System.EventArgs)
' Mã của bạn ở đây
kết thúc phụ
Nhưng chỉ cần chọn sự kiện cho thành phần thì dễ dàng hơn nhiều.