2010-02-09 15 views
7

मैं सी # कोड का एक टुकड़ा लिख ​​रहा हूं जो इंस्टॉलर लॉन्च करता है और अन्य सामानों के साथ जारी रखने से पहले वापस लौटने की प्रतीक्षा करता है।सी # स्पॉन्डेड प्रक्रियाओं का पता लगाना

मुझे कुछ इंस्टॉलरों के साथ परेशानी हो रही है जो मूल प्रक्रियाओं के साथ वास्तविक प्रक्रियाओं के साथ लौटने वाली मूल प्रक्रियाओं के साथ अन्य प्रक्रियाओं को जन्म देती हैं। क्या कोई तरीका है कि मैं सभी प्रक्रियाओं को समाप्त होने तक प्रतीक्षा कर सकता हूं?

यहाँ स्पष्ट करने के लिए परिदृश्य मैं कुछ समस्या आ रही है:

  1. लॉन्च Installer1
  2. Installer1/अन्य स्थापना (Installer2)
  3. इंस्टालर 1 रिटर्न
  4. आवेदन स्थापित है सोचता है कि शुरूआत spawns समाप्त हो गया लेकिन इंस्टॉलर 2 अभी भी चल रहा है। इससे ऐप में वर्कफ़्लो के साथ समस्याएं आती हैं।

यहाँ कोड मैं इस समय का उपयोग कर रहा है:

// launch installer 
Process process = windowsApplicationLauncher.LaunchApplication(_localFilePath); 

// wait for process to return 
do 
{ 
    if (!process.HasExited) 
    { 
    } 
} 
while (!process.WaitForExit(1000)); 

if (process.ExitCode == 0) 
{ 
    _fileService.MoveFile(_localFilePath, _postInstallFilePath); 

    _notification.SetComplete(false); 

    return true; 
} 
return false; 
+0

क्या आपके पास तैयार प्रक्रियाएं हैं? जैसे क्या आप इंस्टॉलर 2 को संशोधित कर सकते हैं यदि इससे आपके लिए पूरा होने का पता लगाना आसान हो जाएगा? या किसी और द्वारा आपूर्ति की गई इंस्टॉलर 2 है, या आप यह भी नहीं जानते कि अतिरिक्त प्रक्रियाओं को कैसे बनाया जा सकता है और मनमाने ढंग से उत्पन्न प्रक्रियाओं को संभालने की आवश्यकता है? – itowlson

+0

हम प्रश्न में विशेष इंस्टॉलर के मालिक हैं। हालांकि हम मनमाने ढंग से उत्पन्न प्रक्रियाओं को संभालने में भी सक्षम होना चाहेंगे। – tjjjohnson

उत्तर

6

क्या आपने इस समस्या को हल करने के लिए डब्ल्यूएमआई का उपयोग करने के बारे में सोचा है?

आप प्रक्रिया निर्माण और हटाने की घटनाओं को सुनने के लिए WMI का उपयोग कर सकते हैं। प्रश्न 967668 एक अच्छा उदाहरण है।

आप एक प्रक्रिया निर्माण घटना प्राप्त करते हैं, आप एक WMI क्वेरी निर्धारित करने के लिए प्रक्रिया एक बच्चे (या एक बच्चे आदि का एक चाइल्ड) की तरह कुछ के साथ अपनी जड़ संस्थापक की है जारी कर सकता है निम्नलिखित:

" चुनें * Win32_Process से जहां ParentProcessId = "।

+0

बहुत उपयोगी के लिए धन्यवाद। – tjjjohnson

0

यह बेहतर हो सकता है यह do/while पाश अंदर इस तरह से करने के लिए:

 
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(proc.ProcessName, Environment.MachineName); 

तब के माध्यम से पुनरावृति procs यह पता लगाने के लिए कि अभी भी कौन सा चल रहा है ... HasExited संपत्ति का उपयोग करके ...

तर्क किया जा रहा है कि इस प्रक्रिया के subprocesses, अपने कोड के स्वामित्व में हैं तो आप, नहीं तो पहले जांच कर सकता है अगर वे या बाहर आ गए हैं नहीं, पाशन रखना ...

आशा इस मदद करता है, सादर, टॉम।

+0

यह मुझे उसी नाम से प्रक्रियाओं की एक सूची देता है जैसा मैंने लॉन्च किया है (setup.exe) मुझे उस सेटअप द्वारा उत्पन्न msiexec.exe प्रक्रियाओं में रूचि है। – tjjjohnson