2009-01-22 9 views
21

मैं एक प्रक्रिया को समाप्त करने के लिए इंतजार करना चाहता हूं, लेकिन process.WaitForExit() मेरी जीयूआई लटकता है। क्या कोई ईवेंट-आधारित तरीका है, या क्या मुझे बाहर निकलने तक ब्लॉक करने के लिए थ्रेड को बढ़ाने की आवश्यकता है, फिर ईवेंट को स्वयं प्रतिनिधि दें?प्रक्रिया। WaitForExit() asynchronously

+0

यहां एक ** पूरी तरह से async ** 'प्रक्रिया 'का कार्यान्वयन है जो आपको मानक आउटपुट और मानक त्रुटि धाराओं को पुनर्निर्देशित करने देता है http://stackoverflow.com/a/39872058/1212017। –

उत्तर

1

उपयोग System.Diagnostics.Process.Exited

4

According to this link WaitForExit() विधि जब तक जुड़े प्रक्रिया समाप्त हो जाता है वर्तमान धागा प्रतीक्षा करने के लिए प्रयोग किया जाता है। हालांकि, प्रक्रिया में एक मौजूदा घटना होती है जिसमें आप हुक कर सकते हैं।

+3

तब यह क्या है? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited.aspx –

+0

सत्य नहीं है, मुझे लगता है कि उत्तर को संक्षिप्त डाउनवॉट्स को नहीं हटाया जाना चाहिए। रिकॉर्ड के लिए –

55

.NET 4.0 के रूप में/सी # 5, होना बेहतर होता है async पद्धति का उपयोग कर इस प्रतिनिधित्व करते हैं।

/// <summary> 
/// Waits asynchronously for the process to exit. 
/// </summary> 
/// <param name="process">The process to wait for cancellation.</param> 
/// <param name="cancellationToken">A cancellation token. If invoked, the task will return 
/// immediately as canceled.</param> 
/// <returns>A Task representing waiting for the process to end.</returns> 
public static Task WaitForExitAsync(this Process process, 
    CancellationToken cancellationToken = default(CancellationToken)) 
{ 
    var tcs = new TaskCompletionSource<object>(); 
    process.EnableRaisingEvents = true; 
    process.Exited += (sender, args) => tcs.TrySetResult(null); 
    if(cancellationToken != default(CancellationToken)) 
     cancellationToken.Register(tcs.SetCanceled); 

    return tcs.Task; 
} 

उपयोग:

public async void Test() 
{ 
    var process = new Process("processName"); 
    process.Start(); 
    await process.WaitForExitAsync(); 

    //Do some fun stuff here... 
} 
+1

भी सेट करना होगा धन्यवाद, यह सहायक था। एक बात यह है कि मेरे साथ प्रबलता थी, हालांकि, यह है कि 'tcs.SetResult (null)' कार्य को पहले से रद्द कर दिया गया था, तो 'अवैध ऑपरेशन अपवाद' फेंकता है, यदि कार्य रद्द होने के बाद प्रक्रिया समाप्त हो जाती है तो ऐसा हो सकता है। इसे ठीक करने के लिए, मैंने 'tcs.SetResult' को' tcs.TrySetResult' के साथ बदल दिया। –

+0

@aj_r अच्छी टिप। धन्यवाद। मैंने अद्यतन किया। – MgSam

+4

अगर हमारे मौजूदा हैंडलर को पंजीकृत करने से पहले प्रक्रिया बंद हो जाती है, तो हम हमेशा के लिए इंतजार कर रहे हैं। पंजीकरण शुरू करने से पहले किया जाना चाहिए ताकि StartAsync विधि लिखना अधिक आसान हो। अधिकतर कोड, लेकिन एक प्रक्रिया के साथ StartAsync नामित। वापसी लाइन से पहले स्टार्ट() बस। – MuiBienCarlota

6

आप @MgSam जवाब चुनते हैं, तो बारे में पता होना है, अगर आपको लगता है कि स्वचालित रूप से निर्दिष्ट विलंब के बाद रद्द कर दिया जाएगा, WaitForExitAsync कुछ CancellationToken के माध्यम से पारित, तो आप एक InvalidOperationException मिल सकती है। कि सुलझाने के लिए आपको

cancellationToken.Register(tcs.SetCanceled); 

cancellationToken.Register(() => { tcs.TrySetCanceled(); }); 

को पी.एस बदलने की जरूरत है .: समय में अपने CancellationTokenSource निपटान के लिए मत भूलना।

+0

वह पीएस मेरी ज़िंदगी बचाई.... – Fazi

संबंधित मुद्दे