2010-02-24 13 views
5

मेरे पास एक परिदृश्य है जहां मेरे पास Winforms में डेटाग्रिड से जुड़ी वस्तुओं का संग्रह है। यदि कोई उपयोगकर्ता ग्रिड पर किसी आइटम को ड्रैग और ड्रॉप करता है, तो मुझे ग्रिड में प्लेसहोल्डर पंक्ति जोड़ने और लंबी एसिंक आयात प्रक्रिया को बंद करने की आवश्यकता होती है। मुझे UI में वापस एसिंक आयात प्रक्रिया की स्थिति को संवाद करने की आवश्यकता है, ग्रिड में पंक्ति को अपडेट करना और UI को अन्य पंक्तियों को संपादित करने की अनुमति देने के लिए उत्तरदायी बने रहें।WinForms में डाटाबेसिंग async डेटा आयात

ऐसा करने के लिए सबसे अच्छा अभ्यास क्या है?

मेरा वर्तमान समाधान है: ग्रिड में thread safe implementation of BindingList बाध्यकारी, जो ग्रिड में पंक्तियों के रूप में प्रदर्शित वस्तुओं से भरा हुआ है। जब कोई उपयोगकर्ता ग्रिड पर किसी आइटम को ड्रैग और ड्रॉप करता है, तो मैं एक नई ऑब्जेक्ट बनाता हूं जिसमें गिराए गए आइटम से प्राप्त स्पैस जानकारी होती है और उस पंक्ति के संपादन को अक्षम करने के लिए बाध्यकारी सूची में जोड़ें। मैं फिर आयात करने के लिए एक अलग थ्रेड को आग लगा देता हूं, इसे डेटा से भरने के लिए बनाई गई नई बाध्य वस्तु को पास करता हूं। आयात प्रक्रिया, समय-समय पर ऑब्जेक्ट की स्थिति सेट करती है और यूआई द्वारा सब्सक्राइब की गई एक घटना को आग लगती है जो ऑब्जेक्ट पर नई गुण देखने के लिए ग्रिड को रीफ्रेश करने के लिए कहती है।

क्या मुझे उसी ऑब्जेक्ट को पास करना चाहिए जो आयात प्रक्रिया थ्रेड पर ग्रिड से जुड़ा हुआ है, या मुझे एक प्रतिलिपि बनाना चाहिए और BeginInvoke का उपयोग करके UI थ्रेड पर ऑब्जेक्ट में परिवर्तनों को विलय करना चाहिए?

इस कार्यान्वयन के साथ कोई समस्या या सलाह?

धन्यवाद

+0

बाध्यकारी सूची में निहित आपकी ऑब्जेक्ट्स की प्रकृति के बारे में अधिक जानने के बिना वास्तव में बताना मुश्किल है। क्या वे स्वयं भी थ्रेड-सुरक्षित हैं? यदि हां, तो किस कीमत पर? क्या वे सिर्फ सादे क्षेत्रों का एक सेट हैं, या क्या कुछ जटिल डेटा संरचनाएं हैं, जैसे सूचियां और पेड़ शामिल हैं? पूर्व मामले में, आप इसे छोड़कर इसे छोड़ सकते हैं: यह "एक लेखक, एक पाठक" स्थिति है, थ्रेड-सुरक्षित होना चाहिए। बाद के मामले में, इस बात पर निर्भर करता है कि आप थ्रेड सुरक्षा कैसे सुनिश्चित करते हैं: यह एक महत्वपूर्ण प्रदर्शन जुर्माना उत्पन्न कर सकता है। किसी भी तरह, कृपया वस्तुओं के बारे में और बताएं, तो यह बताना आसान होगा। –

उत्तर

1

ठीक है ...

मैं घटनाओं के प्रवाह को कुछ इस तरह से किया जा रहा देखें:

  1. उपयोगकर्ता खींच लेता है और ग्रिड के लिए आइटम बूँदें
  2. async प्रक्रिया की शुरूआत की है
  3. यूजर इंटरफेस है "प्रसंस्करण"
  4. कॉलबैक हैंडलर को एसिंक प्रक्रिया
  5. async कॉलबैक अपडेट बी दिखाने के लिए अपडेट किया गया इंडिंग स्रोत
  6. async कॉलबैक नए डेटा को रखने के लिए दृश्य को रीफ्रेश करने के लिए ग्रिड पर "डेटाबेस" कॉल करता है।

मैं पृष्ठभूमि कार्यकर्ता के बजाय धागे का उपयोग करता हूं लेकिन थ्रेड के साथ काम करने में काफी आत्मविश्वास रखता हूं।

पृष्ठभूमि कार्यकर्ता थ्रेडिंग को सरल बनाता है, यह मेरा अनुशंसित प्रारंभ बिंदु होगा यदि आप आत्मविश्वास नहीं रखते हैं।

इस तरह आप स्रोत और यूई को एक साथ अपडेट करते हैं और उपयोगकर्ता प्रसंस्करण के दौरान एप्लिकेशन का उपयोग जारी रख सकते हैं।

0

यह एक रिपोर्टिंग प्रगति पृष्ठभूमि कार्यकर्ता की तरह लगता है आप अपने आयात संचालन और ui रिपोर्टिंग करने के लिए मदद मिलेगी। आप MSDN

0

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

अलविदा

0

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

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