क्या पृष्ठभूमि वर्कर सी # थ्रेड सुरक्षित है?कैसे सुनिश्चित करें यूआई उत्तरदायी है पृष्ठभूमिवर्कर
कारण मैं इस पूछना क्योंकि मैं इसके साथ एक अलग धागे पर एक नियंत्रण करने के लिए parented नहीं जा सकती है
अपवाद एक धागे पर बनाया गया एक
नियंत्रण हो जाता है। यह मेरा
DoWork
घटना कोड है:private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { var openFile = document.Open(MyFileName); e.Result = openFile; }
जहां
document
एक UI नियंत्रण है कि जब माता पिता प्रपत्र बनाई गई है आरंभ नहीं हो जाता है।Open
विधि के दौरानdocument
में विभिन्न गुणों को भर दिया जाएगा।मैंने कोड को बदलने के लिए कोड बदलने की कोशिश की, फिर भी वही समस्या बनी रहती है। i.e,
document.GetType().GetMethod("Open)".Invoke(document, new object[]{MyFileName})
उपरोक्त के समान त्रुटि उत्पन्न करेगा।
कोई विचार कैसे
document
नियंत्रण में हेरफेर करना है? दूसरे शब्दों में, उपर्युक्त कोड कैसे काम करें?संपादित करें: यह सुझाव दिया गया था कि मैं
Control.Invoke
का उपयोग करता हूं, लेकिन यह अभी भी काम नहीं करता है (दोनों थ्रेड फांसी)। इस कोड को मैंने कोशिश की है:private delegate bool OpenFile(string filePath); private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { OpenFile oF = new OpenFile(document.Open); var openFile = Invoke(oF, MyFileName); // it doesn't really matter whether I use BeginInvoke or Invoke, or other Control.Invoke, the end result is the same. Both the main thread hosting the document and the thread that launches the UI hanged. e.Result = openFile; }
@ मेहद्राड, मुझे UI उत्तरदायी रखने के लिए पृष्ठभूमि कार्यकर्ता की आवश्यकता है, जो * है * यह समझ में क्यों आता है। – Graviton
@Ngu जल्द ही: निश्चित रूप से, यदि आपके पास लंबे समय तक चलने वाला कार्य है जो केवल यूआई ऑपरेशंस नहीं है, तो आप इसका उपयोग करेंगे। यदि * डूवर्क 'विधि में आप * ऑल ऑब्जेक्ट्स में हेरफेर करना चाहते हैं, तो आपको' BackgroundWorker' का उपयोग नहीं करना चाहिए और कारण यह है कि आपको अंततः यूआई थ्रेड पर उन सभी यूआई ऑपरेशंस करना होगा। –
यह समझ में आता है और यह अधिक सूक्ष्म हो सकता है। धागा सिर्फ "यूआई थ्रेड" को सूचित कर सकता है कि "कुछ नया हुआ", और उसके बाद यूआई को जो भी अधिसूचना हैंडलर पर यूआई को अपडेट करने के लिए यूआई को अपडेट करना है। –