Kabuklu uygulamanın tamamlanmasını beklemek için Visual C# kullanma

Bu makalede, microsoft .NET Framework Process sınıfını kullanarak kodunuzdan başka bir uygulama başlatmayı ve devam etmeden önce kodun diğer uygulamanın kapanmasını beklemesini nasıl bekleyeceğinizi gösterir.

Orijinal ürün sürümü: Visual C# .NET
Özgün KB numarası: 305369

Özet

Kod uygulamanın tamamlanmasını beklediğinde iki seçenek vardır:

  • Diğer uygulamanın bitmesini veya kullanıcı tarafından kapatılmasını süresiz olarak bekleyin.
  • Kodunuzdan uygulamayı kapatabileceğiniz bir zaman aşımı dönemi belirtin.

Bu makalede her iki yaklaşımı da gösteren iki kod örneği verilmiştir. Buna ek olarak, zaman aşımı örneği diğer uygulamanın yanıt vermeyi durdurması (kilitlenmesi) olasılığını sağlar ve uygulamayı kapatmak için gerekli adımları uygular.

Bu makale, aşağıdaki .NET Framework Sınıf Kitaplığı ad alanına System.Diagnosticsbaşvurur.

Ad alanlarını dahil et

Aşağıdaki örnekleri çalıştırmadan önce sınıfın Process ad alanını içeri aktarmanız gerekir. Aşağıdaki kod satırını, kod örneğini içeren Ad Alanı veya Sınıf bildiriminden önce yerleştirin:

using System.Diagnostics;

Kabuklu uygulamanın bitmesini süresiz olarak bekleyin

Aşağıdaki kod örneği başka bir uygulama (bu örnekte Not Defteri) başlatır ve uygulamanın kapanmasını süresiz olarak bekler:

//How to Wait for a Shelled Process to Finish
//Get the path to the system folder.
string sysFolder=
Environment.GetFolderPath(Environment.SpecialFolder.System);
//Create a new process info structure.
ProcessStartInfo pInfo = new ProcessStartInfo();
//Set the file name member of the process info structure.
pInfo.FileName = sysFolder + @"\eula.txt";
//Start the process.
Process p = Process.Start(pInfo);
//Wait for the window to finish loading.
p.WaitForInputIdle();
//Wait for the process to end.
p.WaitForExit();
MessageBox.Show("Code continuing...");

Kabuklu uygulama için zaman aşımı sağlama

Aşağıdaki kod örneği, kabuklu uygulama için zaman aşımı ayarlar. Örneğin zaman aşımı 5 saniye olarak ayarlanmıştır. Testiniz için bu sayıyı (milisaniye cinsinden hesaplanır) ayarlamak isteyebilirsiniz.

//Set a time-out value.
int timeOut=5000;
//Get path to system folder.
string sysFolder=
    Environment.GetFolderPath(Environment.SpecialFolder.System);
//Create a new process info structure.
ProcessStartInfo pInfo = new ProcessStartInfo();
//Set file name to open.
pInfo.FileName = sysFolder + @"\eula.txt";
//Start the process.
Process p = Process.Start(pInfo);
//Wait for window to finish loading.
p.WaitForInputIdle();
//Wait for the process to exit or time out.
p.WaitForExit(timeOut);
//Check to see if the process is still running.
if (p.HasExited == false)
    //Process is still running.
    //Test to see if the process is hung up.
    if (p.Responding)
        //Process was responding; close the main window.
        p.CloseMainWindow();
    else
        //Process was not responding; force the process to close.
        p.Kill();
    MessageBox.Show("Code continuing...");

Sorun giderme

Bazen bu iki seçenek arasında seçim yapmak zor olabilir. Zaman aşımının birincil amacı, diğer uygulama kilitlendiğinden uygulamanızın askıda kalmamasını sağlamaktır. Zaman aşımları, kullanıcının diğer uygulamanın durdurulduğunu bilmediği veya kapatmak için uygun bir yolu olmadığı arka plan işleme gerçekleştiren kabuklu bir uygulama için daha uygundur.