Tunggu sampai proses berakhir

206

Saya sudah punya aplikasi

Process.Start()

untuk memulai aplikasi lain 'ABC'. Saya ingin menunggu sampai aplikasi itu berakhir (proses mati) dan melanjutkan eksekusi saya. Bagaimana saya bisa melakukannya?

Mungkin ada beberapa contoh aplikasi 'ABC' yang berjalan pada saat yang sama.

NLV
sumber
Dan jika Anda ingin melakukannya secara tidak sinkron (yaitu meningkatkan acara setelah selesai), Anda dapat melihat di sini di SO.
Matt

Jawaban:

401

Saya pikir Anda hanya menginginkan ini:

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

Lihat halaman MSDN untuk metode ini. Ini juga memiliki kelebihan di mana Anda dapat menentukan batas waktu, sehingga Anda tidak berpotensi menunggu selamanya.

Noldorin
sumber
137

Gunakan Process.WaitForExit? Atau berlangganan Process.Exitedacara jika Anda tidak ingin memblokir? Jika itu tidak sesuai keinginan Anda, beri kami informasi lebih lanjut tentang persyaratan Anda.

Jon Skeet
sumber
info pasti bagus dengan Process.Exited, tetapi OP memang mengatakan "tunggu"
Mike M
8
@MikeM: Itulah sebabnya saya merujuk WaitForExitpertama ... dalam beberapa kasus Anda mungkin ingin mengeksekusi lebih banyak kode ketika sesuatu selesai, tetapi itu tidak berarti Anda perlu memblokir utas saat ini.
Jon Skeet
7
Jika Anda akan menggunakan Process.Exitedacara tersebut, saya yakin Anda harus mengonfigurasi proses sebelumnya dengan menyetel Process.EnableRaisingEventske true. Padahal, mengingat pertanyaan ini sudah berusia lebih dari tiga tahun, mungkin Process.EnableRaisingEventsitu bukan pertanyaan yang diajukan pada saat itu.
Will
Saya akhirnya membaca halaman ini untuk mencari nama Process.Exitedacara. Terima kasih! +1 untuk kelengkapan
Chad
36

Saya melakukan hal berikut dalam aplikasi saya:

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.

Ada beberapa fitur tambahan di sana yang mungkin berguna bagi Anda ...

AnthonyLambert
sumber
17

Anda bisa menggunakan tunggu untuk keluar atau Anda dapat menangkap properti HasExited dan memperbarui UI Anda agar pengguna "mendapat informasi" (manajemen ekspektasi):

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

Saya punya kasus di mana Process.HasExitedtidak berubah setelah menutup jendela milik proses. Begitu Process.WaitForExit()juga tidak berhasil. Saya harus memonitor Process.Respondingyang salah setelah menutup jendela seperti itu:

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

Mungkin ini membantu seseorang.

Buka
sumber
6

Process.WaitForExit seharusnya hanya apa yang Anda cari, saya pikir.

Hans Olsson
sumber
1

Mengacu pada contoh Microsoft: [ https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.8]

Yang terbaik adalah mengatur:

myProcess.EnableRaisingEvents = true;

selain itu Kode akan diblokir. Juga tidak diperlukan properti tambahan.

// Start a process and raise an event when done.
myProcess.StartInfo.FileName = fileName;
// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents = true;
// Eventhandler wich fires when exited
myProcess.Exited += new EventHandler(myProcess_Exited);
// Starts the process
myProcess.Start();

// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
                  $"Exit time    : {myProcess.ExitTime}\n" +
                  $"Exit code    : {myProcess.ExitCode}\n" +
                  $"Elapsed time : {elapsedTime}");
}
Julian
sumber
0

Seperti yang dikatakan Jon Skeet, gunakan 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);
}
David Lopes
sumber
Tidak benar-benar menjawab pertanyaan itu. Harap pertajam jawaban Anda untuk menyelesaikan pertanyaan
Grantly
Dan sekarang? mungkin buka vb dan buat solusinya;)
David Lopes
-5

Coba ini:

string command = "...";
var process = Process.Start(command);
process.WaitForExit();
pengguna3065161
sumber
5
Apa gunanya mengomentari jawaban atas pertanyaan yang sudah dijawab tentang pertanyaan yang sudah dijawab? Anda tidak hanya telah membuang siklus Anda sendiri, tetapi Anda telah memaksa saya untuk membuang siklus saya juga.
Jamie Ivanov
@AdamBilinski pertanyaan dan jawaban dimaksudkan untuk dilihat oleh orang lain yang memiliki pertanyaan tidak hanya orang yang bertanya
L3n
4
@ L3n Saya setuju, tapi jawaban ini persis sama dengan jawaban yang diterima jadi tidak ada gunanya!
Adam Bilinski
@AdamBilinski Oh ya tidak membaca komentar Anda dengan benar, maafkan saya xD
L3n