टीपीएल के साथ 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);
स्रोत
2011-02-12 17:31:56
त्वरित परीक्षण के लिए एक आदर्श उम्मीदवार की तरह लगता है ... इसे आजमाएं। – Oded