2010-11-08 10 views
10

निम्न परिदृश्य पर विचार करें: मैं अपना आवेदन चला रहा हूं, इसके निष्पादन के दौरान, एक और प्रक्रिया चलाने के लिए और केवल दूसरी प्रक्रिया के बाद आंतरिक विशिष्ट प्रारंभिकता समाप्त हो जाती है, मेरा पहला प्रक्रिया जारी है। उदाहरण के लिए:इंटरप्रोसेस सिंक्रनाइज़ेशन ऑब्जेक्ट्स का उपयोग करके 2 प्रक्रियाओं को सिंक्रनाइज़ करना - म्यूटेक्स या ऑटो रीसेट इवेंट

... 
// Process1 code does various initializations here 
Process.Start("Process2.exe"); 
// Wait until Process2 finishes its initialization and only then continue (Process2 doesn't exit) 
... 

मैं कई विकल्प दिखाई:

  1. Mutex - Mutex मन में स्वचालित रूप से आता है जब interprocess संचार पर विचार, हालांकि, मैं नहीं Process1 एक के लिए प्रतीक्षा करने के कारण का एक तरीका देख सकते हैं mutex कि वह खुद को उत्पन्न किया। मैं एक म्युटेक्स बना सकते हैं और जब तक Mutex बनाई गई है Process1 पर इंतजार
  2. AutoResetEvent (मतदान और Mutex.OpenExisting समारोह का उपयोग करके) के लिए Process2 पैदा कर सकता है - वे काम के लिए बिल्कुल सही होगा, फिर भी, लगता है कि नेट के तहत इन में इंटरप्रोसेस संचार के लिए इस्तेमाल नहीं किया जा सकता है।
  3. CreateEvent - मैं पी/आमंत्रण का उपयोग कर सकता हूं और Win32 CreateEvent फ़ंक्शन का उपयोग कर सकता हूं। सिद्धांत रूप में, यह मुझे आवश्यक सब कुछ प्रदान कर सकता है। हालांकि, यदि संभव हो तो मैं देशी कार्यों का उपयोग नहीं करना चाहूंगा।
  4. बाहरी फ़ाइल का उपयोग करें - सबसे आसान तरीका केवल कुछ ओएस बाहरी ऑब्जेक्ट (फ़ाइल, रजिस्ट्री, आदि) का उपयोग करना होगा। हालांकि, यह बदकिस्मत लगता है, हालांकि।

मुझे इस मामले के लिए आपकी राय सुनकर खुशी होगी।

धन्यवाद!

उत्तर

10

मैं सिर्फ this answer संपादित करने के लिए जा रहा था पढ़ा है, लेकिन यह सही नहीं लगता है। तो मैं अपना खुद का पोस्ट करूंगा ...

Threads for C# पृष्ठ के अनुसार, जिसमें बहुत सारे सिंक्रनाइज़ेशन ट्यूटोरियल हैं, AutoResetEvent इंटरप्रोसेस सिंक्रनाइज़ेशन के लिए उपयोग नहीं किया जा सकता है।


हालांकि, एक नाम EventWaitHandle इंटरप्रोसेस सिंक्रनाइज़ेशन के लिए उपयोग किया जा सकता है। उपरोक्त पृष्ठ में, Creating a Cross-Process EventWaitHandle अनुभाग पर जाएं।

जिस तरह से आप इसे सेट अप सीधी-सपाट है:

  • प्रक्रिया 1 में एक EventWaitHandle बनाएँ, प्रक्रिया 2.
  • शुरू करने की प्रक्रिया शुरू करने के बाद 2 से पहले, मौजूदा धागा ब्लॉक करने के लिए EventWaitHandle.WaitOne आह्वान।
  • आखिरकार, प्रक्रिया 2 में EventWaitHandle बनाएं और प्रतीक्षा थ्रेड जारी करने के लिए EventWaitHandle.Set का आह्वान करें।

प्रक्रिया 1

EventWaitHandle handle = new EventWaitHandle(
    false,        /* Create handle in unsignaled state */ 
    EventResetMode.ManualReset,   /* Ignored. This instance doesn't reset. */ 
    InterprocessProtocol.EventHandleName /* String defined in a shared assembly. */ 
); 

ProcessStartInfo startInfo = new ProcessStartInfo("Process2.exe"); 
using (Process proc = Process.Start(startInfo)) 
{ 
    //Wait for process 2 to initialize. 
    handle.WaitOne(); 

    //TODO 
} 

प्रक्रिया 2

//Do some lengthy initialization work... 

EventWaitHandle handle = new EventWaitHandle(
    false,       /* Parameter ignored since handle already exists.*/ 
    EventResetMode.ManualReset,   /* Explained below. */ 
    InterprocessProtocol.EventHandleName /* String defined in a shared assembly. */ 
); 
handle.Set(); //Release the thread waiting on the handle. 

अब, EventResetMode के बारे में। चाहे आप EventResetMode.AutoReset या EventResetMode.ManualReset चुनते हैं, आपके आवेदन पर निर्भर करता है।

मेरे मामले में, मुझे मैन्युअल रीसेट की आवश्यकता है क्योंकि मेरे पास एक ही प्रक्रिया से कनेक्ट होने वाली कई प्रक्रियाएं हैं। तो, एक बार यह एक ही प्रक्रिया प्रारंभ की जा रही है, अन्य सभी प्रक्रियाओं को काम करने में सक्षम होना चाहिए। इस प्रकार, हैंडल को एक संकेतित स्थिति (कोई रीसेट नहीं) में छोड़ा जाना चाहिए।

आप के लिए, एक स्वत: रीसेट आप प्रक्रिया 1 शुरू होता है प्रक्रिया 2 हर बार के लिए प्रारंभ प्रदर्शन करने के लिए है, तो उपयोगी हो सकता है।


साइड नोट: InterprocessProtocol.EventHandleName सिर्फ एक निरंतर एक DLL कि दोनों प्रक्रिया 1 और प्रक्रिया 2 संदर्भ अंदर लिपटे है। आपको ऐसा करने की आवश्यकता नहीं है, लेकिन यह आपको नाम को गलत टाइप करने और डेडलॉक करने से बचाता है।

10

मैं ** AutoResetEvent ** पर विचार करूंगा। वे इंटरप्रोसेस संचार के लिए इस्तेमाल किया जा सकता है और वे तेजी से relativley हैं। नीचे दिए गए लिंक देखें: Threads for c#

एक क्रॉस-प्रोसेस EventWaitHandle अनुभाग बना रहा है ...

+3

ऑटोरसेट इवेंट केवल स्थानीय हो सकता है। लेकिन आप सही हैं - EventWaitHandle वही है जो मैं ढूंढ रहा था। धन्यवाद! – VitalyB

+0

ऑटो प्रोसेस संचार के लिए AutoResetEvent और ManualResetEvent का उपयोग क्यों नहीं किया जा सकता है? वे दोनों EventWaitHandle से निकलते हैं – caa

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