2010-06-30 33 views
149

Tôi đã một ứng dụng mà khôngChờ cho đến khi quá trình kết thúc

Process.Start() 

để bắt đầu một ứng dụng 'ABC'. Tôi muốn đợi cho đến khi ứng dụng đó kết thúc (quá trình chết) và tiếp tục thực hiện. Tôi làm nó như thế nào?

Có thể có nhiều lần chạy ứng dụng 'ABC' cùng một lúc.

Trả lời

306

Tôi nghĩ rằng bạn chỉ muốn này:

var process = Process.Start(...); 
process.WaitForExit(); 

Xem MSDN page cho phương pháp này. Nó cũng có một tình trạng quá tải, nơi bạn có thể xác định thời gian chờ, vì vậy bạn không có khả năng chờ đợi mãi mãi.

113

Sử dụng Process.WaitForExit? Hoặc đăng ký sự kiện Process.Exited nếu bạn không muốn chặn? Nếu điều đó không làm những gì bạn muốn, vui lòng cung cấp cho chúng tôi thêm thông tin về các yêu cầu của bạn.

+26

+1 cho sự kiện này. – NLV

+1

làm cho +1 ++ :) – Apelsin

+0

chắc chắn thông tin tốt với Process.Exited, nhưng OP đã nói "chờ đợi" –

14

Bạn có thể sử dụng chờ xuất cảnh, bạn có thể nắm bắt được sở hữu HasExited và cập nhật giao diện người dùng của bạn để giữ cho người sử dụng "thông báo" (quản lý kỳ vọng):

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe"); 
while (!process.HasExited) 
{ 
    //update UI 
} 
//done 
29

tôi làm như sau trong ứng dụng của tôi:

Process process = new Process(); 
process.StartInfo.FileName = executable; 
process.StartInfo.Arguments = arguments; 
process.StartInfo.ErrorDialog = true; 
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 
process.Start(); 
process.WaitForExit(1000 * 60 * 5); // Wait up to five minutes. 

có một vài tính năng bổ sung trong đó mà bạn có thể thấy hữu ích ...

+1

không "nó cũng hoạt động tốt ...." – AnthonyLambert

-5

Hãy thử điều này:

string command = "..."; 
var process = Process.Start(command); 
process.WaitForExit(); 
+4

Điểm nhận xét về câu trả lời cho câu hỏi đã được trả lời về câu hỏi đã được trả lời là gì? Không chỉ có bạn lãng phí chu kỳ của riêng bạn nhưng bạn đã buộc tôi phải lãng phí của tôi quá. –

+0

@AdamBilinski câu hỏi và câu trả lời được dự định để được nhìn thấy bởi những người khác có câu hỏi không chỉ là một trong những người yêu cầu – L3n

+4

@ L3n Tôi đồng ý, nhưng câu trả lời này là chính xác giống như câu trả lời chấp nhận vì vậy nó là vô nghĩa! –

4

Tôi đã gặp trường hợp Process.HasExited không thay đổi sau khi đóng cửa sổ thuộc quá trình. Vì vậy, Process.WaitForExit() cũng không hoạt động. Tôi phải theo dõi Process.Responding đã được chuyển thành false sau khi đóng cửa sổ như thế:

while (!_process.HasExited && _process.Responding) { 
    Thread.Sleep(100); 
} 
... 

Có lẽ điều này sẽ giúp ai đó.

0

Giống như Jon Skeet nói, sử dụng Process.Exited:

proc.StartInfo.FileName = exportPath + @"\" + fileExe; 
proc.Exited += new EventHandler(myProcess_Exited); 
proc.Start(); 
inProcess = true; 

while (inProcess) 
{ 
    proc.Refresh(); 
    System.Threading.Thread.Sleep(10); 
    if (proc.HasExited) 
    { 
     inProcess = false; 
    } 
} 

private void myProcess_Exited(object sender, System.EventArgs e) 
{ 
    inProcess = false; 
    Console.WriteLine("Exit time: {0}\r\n" + 
     "Exit code: {1}\r\n", proc.ExitTime, proc.ExitCode); 
} 
+0

Không thực sự trả lời câu hỏi. Vui lòng tinh chỉnh câu trả lời của bạn để giải quyết câu hỏi – Grantly

+0

Và bây giờ? có thể mở vb và đưa ra giải pháp;) –

Các vấn đề liên quan