2012-05-16 15 views
5

चल रहे उदाहरणों में से मैं बहु उदाहरण एप्लिकेशन पर काम कर रहा हूं। सी # में यह जानने के लिए कोई तरीका है कि वर्तमान में कितने उदाहरण चल रहे हैं।
मैंने अपने एप्लिकेशन नाम की विंडो प्रक्रियाओं की गणना करने के लिए कोड का एक टुकड़ा इस्तेमाल किया लेकिन यह एक अच्छा तरीका नहीं है।सेमफोर कार्यान्वयन। वर्तमान में

string fileName = Process.GetCurrentProcess().MainModule.FileName; 
int count = 0; 
foreach (Process p in Process.GetProcesses()) 
{ 
    try 
    { 
     if (p.MainModule.FileName == fileName) 
     { 
      count++; 
     } 
    } 
    catch { } 
} 

MessageBox.Show("Total Instances Running are " + count); 


यह सेमाफोर का उपयोग करके किया जा सकता है या कुछ वेतन वृद्धि और घटती काउंटर जब एक उदाहरण बंद कर देता है कि एक के बाद एक से वृद्धि की जाती है जब नया उदाहरण बनाया है और घटती है।

उत्तर

1

एक Semaphore आप उलटी गिनती, जब आप 0. आप एक वैश्विक सेमाफोर इस्तेमाल कर सकते हैं करने के लिए मिल क्या आप को अवरोधित करने में मदद करता है, लेकिन आप एक पर्याप्त उच्च-मूल्य पर यह प्रारंभ और उल्टी गिनती शुरू करने के लिए होगा।

मुझे लगता है कि सब कुछ, आपका स्वयं का समाधान शायद सबसे साफ है।

+0

उत्तर के लिए धन्यवाद। क्या आप मुझे एमएसडीएन को छोड़कर कुछ अन्य संसाधन बता सकते हैं। –

+0

Google? https://www.google.co.il/search?q=.net+semaphore&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a – zmbq

+0

सेमफोर के साथ समस्या कक्षा यह है कि आप इसे जारी किए बिना गिनती नहीं प्राप्त कर सकते हैं, जो कुछ सुंदर गन्दा कोड उत्पन्न कर सकता है ... –

1

आप साझा स्मृति का उपयोग क्यों नहीं करते? निस्संदेह आपको इसे सभी प्रक्रियाओं के लिए एक म्यूटेक्स के साथ संरक्षित करना होगा, लेकिन इस तरह आप आमतौर पर सभी प्रक्रियाओं के बीच उपयोग किए गए डेटा को स्टोर कर सकते हैं।

मुझे लगता है कि आपको साझा स्मृति को पी/आमंत्रित करना है, साझा स्मृति बनाने के लिए आदेश है, लेकिन यह वास्तव में सीधा है।

1

एकाधिक प्रक्रियाओं का प्रबंधन कभी समस्या नहीं है। ओएस उनके बीच एक बड़ी दीवार रखता है जो इसे कुछ भी कठिन और महंगा बनाता है। जिस कोड का आप उपयोग कर रहे हैं वह कोई अपवाद नहीं है, चल रही प्रक्रियाओं को फिर से चलाना महंगा है। हमेशा पहले धागे का उपयोग करने पर विचार करें और एक .NET प्रोग्राम में ऐपडोमेन्स की तलाश करें, एक ऐसी सुविधा जो स्पष्ट रूप से आविष्कार प्रदान करती है, एक प्रक्रिया प्रदान कर सकती है लेकिन इंटरऑप बाधा को मारने की लागत के बिना।

यदि आप एक बहु-प्रक्रिया समाधान के लिए प्रतिबद्ध हैं तो आपको लगभग हमेशा एक अलग प्रक्रिया की आवश्यकता होती है जो एक मध्यस्थ के रूप में कार्य करता है। कार्यकर्ता प्रक्रियाओं को शुरू करने और कुछ अर्थपूर्ण करने के लिए जिम्मेदार होना जब उनमें से एक एक अनचाहे अपवाद पर मर जाता है। जो कुछ भी खुद से निपटने में बहुत मुश्किल है क्योंकि इसके मरने के कारण के बारे में कोई जानकारी प्राप्त करने का कोई अच्छा तरीका नहीं है और आपने राज्य की भारी मात्रा खो दी है। सामान्य परिणाम पूरे ऐप का एक ख़राब है जब तक कि आप इन प्रक्रियाओं को बहुत सरल चीजें नहीं देते हैं जिन्हें आप बिना आसानी से कर सकते हैं।

ऐसी आर्बिटर प्रक्रिया में सस्ता उदाहरणों की गणना करने में कोई समस्या नहीं है, यह काउंटर बनाए रखने के लिए प्रक्रिया का उपयोग कर सकते हैं। मतदान करने की बजाय एक घटना।

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