Bir işlem bitene kadar bekleyin


206

Ben bir uygulama var

Process.Start()

başka bir uygulama 'ABC' başlatmak için. Bu uygulama sona erene kadar beklemek istiyorum (işlem ölür) ve yürütüme devam etmek istiyorum. Nasıl yapabilirim?

Aynı anda çalışan birden fazla 'ABC' uygulaması örneği olabilir.


Ve bunu eşzamansız olarak yapmak istiyorsanız (yani tamamlandıktan sonra bir etkinlik oluşturmak), burada SO'ya bakabilirsiniz .
Matt

Yanıtlar:


401

Bence sadece bunu istiyorsun:

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

Yöntem için MSDN sayfasına bakın . Ayrıca, zaman aşımını belirleyebileceğiniz bir aşırı yüke sahiptir, bu nedenle sonsuza kadar beklemezsiniz.


137

Kullan Process.WaitForExit? Veya Process.Exitedengellemek istemiyorsanız etkinliğe abone olun ? Bu istediğinizi yapmazsa, lütfen gereksinimleriniz hakkında daha fazla bilgi verin.


Process.Exited ile kesinlikle iyi bilgi, ama OP "bekle" dedi
Mike M

8
@MikeM: Bu yüzden önce bahsetmiştim WaitForExit... bazı durumlarda bir şey bittiğinde daha fazla kod çalıştırmak isteyebilirsiniz, ancak bu geçerli iş parçacığını engellemeniz gerektiği anlamına gelmez.
Jon Skeet

7
Process.ExitedOlayı kullanacaksanız, Process.EnableRaisingEventstrue olarak ayarlayarak işlemi önceden yapılandırmanız gerektiğine inanıyorum . Bununla birlikte, bu sorunun üç yaşından büyük olduğu düşünüldüğünde Process.EnableRaisingEvents, sorulduğu sırada bir şey olmayabilir .
Will

Bu sayfada Process.Exitedetkinliğin adını arayarak yaralandım . Teşekkürler! Tamlık için +1
Çad

36

Başvurumda aşağıdakileri yapıyorum:

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.

Burada yararlı bulabileceğiniz birkaç ekstra özellik var ...


17

Çıkmak için beklemeyi kullanabilir veya kullanıcıyı "bilgilendirmek" (beklenti yönetimi) için kullanıcı arayüzünü güncelleyerek HasExited özelliğini yakalayabilirsiniz:

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

9

Process.HasExitedSürece ait pencereyi kapattıktan sonra değişmeyen bir durum vardı . Yani Process.WaitForExit()işe yaramadı. Process.RespondingBöyle pencereyi kapattıktan sonra yanlış gitti izlemek zorunda kaldı :

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

Belki de bu birisine yardım eder.



1

Microsoft örneğine başvurarak: [ https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.8]

En iyisi şunlar olabilir:

myProcess.EnableRaisingEvents = true;

aksi halde Kod engellenir. Ayrıca ek özelliklere gerek yok.

// 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}");
}

0

Jon Skeet'in dediği gibi, şunu kullanın 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);
}

Bu soruya gerçekten cevap vermiyor. Soruyu çözmek için lütfen yanıtınızı hassaslaştırın
Grant

Ve şimdi? belki vb açın ve çözüm yapın;)
David Lopes

-5

Bunu dene:

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

5
Halihazırda cevaplanmış olan soru hakkında daha önce cevaplanmış bir sorunun cevabını yorumlamanın anlamı nedir? Sadece kendi döngülerinizi boşa harcamakla kalmadınız, aynı zamanda beni de benimkini boşa harcamaya zorladınız.
Jamie Ivanov

@AdamBilinski soruları ve cevapları sadece soran soru değil diğer insanlar tarafından görülmesi amaçlanmıştır
L3n

4
@ L3n Kabul ediyorum, ancak bu cevap kabul edilen cevapla tamamen aynı, bu yüzden anlamsız!
Adam Bilinski

@AdamBilinski Oh yea yorumunuzu düzgün
okumamış
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.