2013-04-16 8 views
5

मेरे पास डेटाबेस से उत्पादों को प्राप्त करने का कार्य है, और ContinueWith कार्रवाई जो कुछ यूआई संशोधन संचालित करती है, इसलिए मुझे एक समस्या थी क्योंकि कार्य एक नया धागा बनाते थे, और UI संशोधन को यूआई थ्रेड में निष्पादित नहीं किया गया था।टास्कशेड्यूलर। वर्तमान और कार्यस्केल्डर। फ्रॉमकंटेंट सिंक्रनाइज़ेशन कॉन्टेक्स्ट() अंतर?

मैं इसे ठीक उपयोग करने का प्रयास:

var currentScheduler = TaskScheduler.Current; 

Task.Factory.StartNew(() => 
{  
    // get products 
}).ContinueWith((x) => handleProductsArrived(x.Result, x.Exception), currentScheduler); 

लेकिन यह बिल्कुल भी काम नहीं किया। मैं जांच करता हूं और ContinueWith को मौजूदा शेड्यूलर से थ्रेड में निष्पादित नहीं किया गया था लेकिन एक दूसरे में।

मैं इस विधि की खोज की:

Task.Factory.StartNew(() => 
{ 
    // get products 
}).ContinueWith((x) => handleProductsArrived(x.Result, x.Exception), TaskScheduler.FromCurrentSynchronizationContext()); 

और यह काम करता है। तो मतभेद क्या है? मेरा पहला कोड क्यों काम नहीं किया? धन्यवाद!

उत्तर

12

प्रलेखन से TaskScheduler.Current के लिए:

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

फिर Task Schedulers documentation से: टास्क समानांतर पुस्तकालय और PLINQ के लिए

डिफ़ॉल्ट अनुसूचक .नेट फ्रेमवर्क ThreadPool का उपयोग करता कतार और काम निष्पादित करने के लिए।

तो यदि आप किसी कार्य में नहीं हैं तो TaskScheduler.Current का उपयोग करते हैं, तो आपको शेड्यूलर मिलेगा जो थ्रेड पूल का उपयोग करता है।

यदि आप TaskScheduler.FromCurrentSynchronizationContext() पर कॉल करते हैं, तो आपको वर्तमान synchronization context के लिए एक मिल जाएगा - जो विंडोज फॉर्म या डब्ल्यूपीएफ (जब यूआई थ्रेड से बुलाया जाता है) में एक संदर्भ है जो शेड्यूल प्रासंगिक यूआई थ्रेड पर काम करता है।

इसलिए यही पहला कोड काम नहीं करता है: यह थ्रेड पूल थ्रेड पर आपकी निरंतरता को निष्पादित करता है। आपके दूसरे कोड ने UI थ्रेड पर निरंतरता निष्पादित की।

ध्यान दें कि यदि आप सी # 5 और एसिंक/प्रतीक्षा का उपयोग कर सकते हैं, तो यह सब अधिक अधिक आसानी से संभाला जाता है।

+0

यह उपयोगी है जब आप UI घटक के निर्माता में async/await का उपयोग नहीं कर सकते हैं, है ना? – Chin

+0

@Chin: मैं इसके लिए विशेष रूप से इसका उपयोग नहीं करता - मुझे आमतौर पर एक स्थिर एसिंक विधि होती है जो काम करता है और फिर त्वरित कन्स्ट्रक्टर कहता है। –

+0

क्या आप उस पर थोड़ा और विस्तार कर सकते हैं? विशेष रूप से मेरे यहां एक और सवाल है: http://stackoverflow.com/questions/31886276/handle-exception-when-using-task-run-in-ui-constructor जो कि – Chin

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

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