2011-02-10 17 views
11

यह एक "क्या यह संभव है, और यदि आप मुझे एक त्वरित उदाहरण दे सकते हैं क्योंकि मुझे एक ऑनलाइन नहीं मिल रहा है?" सवाल का प्रकारक्या .NET 4 कार्य समांतर लाइब्रेरी COM ऑब्जेक्ट्स का उपयोग कर सकती है?

मेरे पास कई पूरी तरह अलग हैं (यानी "शर्मनाक समानांतर") प्रक्रियाएं जिन्हें मैं सी # का उपयोग कर .NET Framework 4 में कार्य समांतर लाइब्रेरी का उपयोग करके समानांतर में चलाना चाहता हूं। इनमें से कुछ प्रक्रियाओं को सॉफ़्टवेयर के उपयोग की आवश्यकता होती है जिसे COM/OLE स्वचालन के माध्यम से एक्सेस किया जा सकता है।

विशेष रूप से, एक समानांतर है। Foreach() लूप जो आइटमों की सूची से कार्यों को विभाजित करता है, मूल रूप से समानांतर के अंदर एक अलग फ़ंक्शन को कॉल करता है। प्रसंस्करण को संभालने के लिए तत्काल (इसलिए इनमें से कुछ फ़ंक्शन COM पुस्तकालयों को नियोजित करते हैं काम)।

क्या यह संभव है? धन्यवाद।

+4

त्वरित परीक्षण के लिए एक आदर्श उम्मीदवार की तरह लगता है ... इसे आजमाएं। – Oded

उत्तर

18

टीपीएल के साथ COM ऑब्जेक्ट्स का उपयोग करने के लिए यह 100% संभव है। हालांकि यह सच है कि, डिफ़ॉल्ट रूप से, टीपीएल मानक .NET थ्रेडपूल का उपयोग करेगा, टीपीएल में the TaskScheduler class के माध्यम से एक एक्सटेंशन बिंदु है जो आपको अपना शेड्यूलर प्रदान करने में सक्षम बनाता है जो आपके द्वारा बनाए गए धागे पर काम भेज सकता है।

COM ऑब्जेक्ट्स का उपयोग करने के मामले में आपको सबसे पहले यह जानने की आवश्यकता है कि COM क्लास को एसटीए थ्रेडिंग या एमटीए थ्रेडिंग की आवश्यकता है या नहीं। अगर एमटीए थ्रेडिंग, तो कुछ खास नहीं है जिसे करने की जरूरत है क्योंकि COM क्लास पहले से ही किसी भी यादृच्छिक धागे से उपयोग किया जा सकता है। दुर्भाग्यवश अधिकांश क्लासिक COM ऑब्जेक्ट्स एसटीए थ्रेडिंग पर भरोसा करते हैं और यही वह समय है जब आपको एक कस्टम TaskScheduler को नियोजित करने की आवश्यकता होती है ताकि जो भी .NET थ्रेड आप उनका उपयोग कर रहे हैं, वह initialized as an STA compatible thread रहा है।

जबकि टास्कशेड्यूलर लिखने के लिए बिल्कुल तुच्छ नहीं हैं, लेकिन अगर आपको थ्रेडिंग की मूल समझ हो तो वे वास्तव में लिखना मुश्किल नहीं हैं। सौभाग्य से the ParallelExtensions Extras library पहले से ही StaTaskScheduler कक्षा प्रदान करता है ताकि आपको कुछ भी लिखने की आवश्यकता न हो। पीएफएक्स टीम द्वारा a great blog post here है जो StaTaskScheduler कक्षा के लिए कुछ उपयोग मामलों के कार्यान्वयन पर चर्चा करता है।

असल में, आप अपने वर्गों में से किसी एक पर स्थिर के रूप में एक नया StaTaskScheduler प्रारंभ करना चाहते हैं और फिर बस अपना Tasks निर्दिष्ट करना निर्दिष्ट करें कि वे उस उदाहरण द्वारा निर्धारित हैं। ऐसा कुछ ऐसा दिखाई देगा:

// Create a static instance of the scheduler specifying some max number of threads 
private static readonly StaTaskScheduler MyStaTaskScheduler = new StaTaskScheduler(4); 

.... 

// Then specify the scheduler when starting tasks that need STA threading 
Task.TaskFactory.StartNew(
() => 
{ 
    MyComObject myComObject = new MyComObject(); 

    myComObject.DoSomething(); 

    // ... etc ... 
}, 
CancellationToken.None, 
TaskCreationOptions.None, 
MyStaTaskScheduler); 
+0

बहुत रोचक, मुझे इसमें देखना होगा, धन्यवाद! संदर्भ के लिए प्राथमिक कार्यक्षमता जिसे मैं प्राप्त करने का प्रयास कर रहा हूं वह आर (http://www.r-project.org/) में कई वर्कफ़्लोज़ के समानांतर निष्पादन है। अगर मैं कुछ भी समझता हूं तो मैं यहां वापस रिपोर्ट करूंगा। – user483679

+0

धन्यवाद, बिल्कुल मुझे क्या चाहिए। –

2

यह संभवतः संभव है, लेकिन यह भी काम नहीं कर सकता है।

कई COM ऑब्जेक्ट्स को एक विशिष्ट apartment threading की आवश्यकता होती है। जब आप समानांतर का उपयोग करते हैं। के लिए/ForEach, आप .NET ThreadPool पर चल रहे हैं, जिसमें अपार्टमेंट थ्रेडिंग सेटअप नहीं है। यह काम कर सकता है, और कुछ COM ऑब्जेक्ट्स के लिए कर सकता है, लेकिन क्रैश और अजीब COM अपवाद भी पैदा कर सकता है जो ट्रैक करना मुश्किल है।

0

कुछ अतिरिक्त जानकारी जिन्हें मैं अभी तक सत्यापित नहीं कर रहा हूं, लेकिन यह सहायक हो सकता है। डिफ़ॉल्ट कार्य शेड्यूलर कुछ काम करने के लिए वर्तमान थ्रेड का उपयोग करेगा, फिर आवश्यकतानुसार थ्रेड पूल से अतिरिक्त थ्रेड जोड़ें।

यदि आप समांतर करते समय COM ऑब्जेक्ट साझा कर रहे हैं तो इससे समस्याएं पैदा हो सकती हैं। FEEach। उदाहरण के लिए, मान लें कि आपका मुख्य धागा एसटीए है। आप उस पर COM ऑब्जेक्ट को तुरंत चालू करते हैं और समानांतर का उपयोग करते हैं। कुछ काम करने के लिए प्रत्येक थ्रेड पहले तत्काल COM ऑब्जेक्ट तक पहुंचने का प्रयास करता है। मुझे संदेह है कि यह टूट जाएगा, और प्रारंभिक परीक्षण इसे वापस करने लगता है।इस परिदृश्य में मुझे कम से कम कुछ विकल्प दिखाई देते हैं:

  • मान लें कि COM ऑब्जेक्ट एमटीए का समर्थन करता है, कॉलिंग थ्रेड एमटीए का उपयोग करता है। हालांकि यह अन्य कारणों के लिए एक विकल्प नहीं हो सकता है। उदाहरण के लिए, यदि एप्लिकेशन एक विंडोज़ फॉर्म एप्लीकेशन है, तो मेरा मानना ​​है कि मुख्य() को STAThread विशेषता होना आवश्यक है।
  • वैकल्पिक कार्य शेड्यूलर का उपयोग करें जैसे ड्रू द्वारा वर्णित StaTaskScheduler। आप या तो सभी एसटीए धागे हो सकते हैं या शेड्यूलर का उपयोग कर सकते हैं जो कॉलिंग थ्रेड का उपयोग नहीं करता है और सभी एमटीए थ्रेड चलाता है।
संबंधित मुद्दे