2012-08-28 31 views
5

में स्टेटिक वैरिएबल मैं एक डॉट नेट प्रोजेक्ट पर काम कर रहा हूं, जिसमें एक डीएलएल शामिल है। यह डीएलएल एक .lib (सी कोड) का उपयोग करता है। दुर्भाग्यवश, इस में कई स्थिर चर हैं। Lib। समस्या मेरे पास है:डॉटनेट: डीएलएल

यदि दो उपयोगकर्ता एक ही समय में एक खोज करते हैं, तो मुझे एक त्रुटि मिलती है, क्योंकि वे दोनों .lib तक पहुंचते हैं, जबकि डेटा को पढ़ने की कोशिश करने के दौरान कुछ बदलता है।

स्पष्ट समाधान, एक्सेस को लॉक करना होगा, लेकिन मैं वास्तव में ऐसा नहीं करना चाहता, क्योंकि यह खोज प्रक्रिया को बहुत धीमा कर देता है। मैं बजाय lib से डीएलएल बनाने की कोशिश करता हूं, लेकिन मुझे नहीं पता कि इससे समस्या हल हो जाएगी, क्योंकि मुझे नहीं पता कि स्थैतिक चर अलग-अलग संग्रहीत किए जाएंगे, या यदि दोनों खोज प्रक्रियाएं समान होंगी चर।

क्या किसी के पास इसका अनुभव है? क्योंकि ऐसा करने में काफी समय लगेगा, और मैं यह जानना चाहता हूं कि यह करने से पहले यह काम करता है या नहीं।

मुझे उम्मीद है कि सबकुछ समझ में आता है, क्योंकि अंग्रेजी मेरी पहली भाषा नहीं है, और मेरे प्रोग्रामिंग कौशल बहुत बुनियादी हैं।

+0

* * * * स्थिर * फ़ील्ड के अत्यधिक उपयोग से बचें। * प्रकार * डिज़ाइन बदलने की कोशिश करें। – adatapost

+1

समस्या यह है कि सी कोड statics से भरा है, यह सब कुछ बदलने के लिए रास्ता लंबा लगेगा। एटीएम देखने वाला एकमात्र तेज़ विकल्प, इस डीएलएल "चाल" की कोशिश कर रहा है। – Stefan

+0

@Stefan: एक नई असेंबली में एक नया प्रकार परिभाषित करें जिसमें उस सी कोड (और केवल इसे) तक पहुंच हो, दूसरे शब्दों में इसके लिए एक रैपर। उस प्रकार से एडीएन, जिस तरह से आप चाहते हैं सी संसाधनों के लिए विशेष पहुंच का प्रबंधन करें। इसलिए यदि आप कुछ सी फ़ंक्शन को कॉल करना चाहते हैं, तो आपको उस प्रकार का उपयोग करना होगा, और यदि आप निष्पादन के मिडल में कुछ कॉल करेंगे, तो वही प्रकार आपको अवरोधित करेगा, अपवाद उठाएगा, संदेश दिखाएगा .. जो भी हो। – Tigran

उत्तर

1

जो मैं समझता हूं, उससे कोई भी तरीका नहीं है कि आप इस डीएल के भीतर मौजूदा कक्षाओं का उपयोग करके इसे पढ़ने के दौरान डेटा को अनुकरण रूप से संपादित करने में सक्षम होने जा रहे हैं। स्पष्ट रूप से यह काम नहीं करेगा, इससे कोई फर्क नहीं पड़ता कि आप क्या फैंसी सामान कर रहे हैं।

आप क्या कर सकते हैं Thunking Layer बना सकते हैं। यह एक प्रकार का रैपर वर्ग होगा जिसे .dll के बजाय बुलाया जाएगा। यह कक्षा पढ़ने के लिए डेटा की एक स्थानीय प्रतिलिपि बनाकर समवर्ती I/O अनुरोधों को संभालेगी, और वास्तविक डेटा को संगत संपादन की इजाजत देगी, जब स्थानीय मैनिप्लेशंस समाप्त हो जाएंगे (उचित अस्थायी लॉकिंग आदि के साथ)। ऐसा करने के अन्य मानक तरीके हो सकते हैं जिन्हें मैं नहीं जानता, लेकिन इस तरह मैं शुरू करूंगा।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

विचार यह होगा कि प्रत्येक उपयोगकर्ता के पास डीएलएल चलने का अपना संस्करण होगा। अब समस्या यह है कि, मुझे नहीं पता कि डॉट नेट में, स्थिर चर उपयोगकर्ताओं के बीच साझा किए जाएंगे या नहीं। लेकिन लिंक के लिए धन्यवाद, मैं इसे देख लूंगा, दिलचस्प लगता है! – Stefan

+1

@ .NET Framework' में स्टीफन स्थिर चर को एप्लिकेशन के सभी उपयोगकर्ताओं के बीच साझा किया जाता है, जो इस चर का हिस्सा हैं। यदि आप इस डेटा को उजागर करने के लिए 1 अतिरिक्त परत बनाएंगे तो यह मदद कर सकता है लेकिन मुझे इसके बारे में निश्चित नहीं है। – harry180

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