दिलचस्प पोस्ट
एलिमेंट-वार 2 सूचियों के अलावा? साझा पसंद में प्रतिबद्ध () और लागू () के बीच अंतर क्या है जब आप thread.start () के बजाय java के thread.run () को कॉल करेंगे? rpy2 विंडोज 7 पर स्थापित करें Boost :: asio का उपयोग करते समय मुझे प्रत्येक कनेक्शन की आवश्यकता क्यों है? रिक्त और खाली ("") जावा स्ट्रिंग के बीच अंतर Xcode 6 VECTOR छवि संपत्ति की अनुमति देता है … किसी भी विचार का उपयोग कैसे करें? ईगिट और गीथहब के साथ "ऑथ विफल" त्रुटि दृश्य स्टूडियो SignTool.exe नहीं मिला एंड्रॉइड संसाधनों / मूल्यों में फ्लोटिंग पॉइंट वैल्यू जोड़ें क्यूटी स्थिर लिंकिंग और तैनाती सी: कैसे एक EOF अनुकरण करने के लिए? मैवेन का उपयोग करके निर्भरता के साथ मैं निष्पादन योग्य जार कैसे बना सकता हूं? मैं अजगर का उपयोग कर प्रत्यक्ष-निष्पादन योग्य क्रॉस-प्लेटफार्म जीयूआई ऐप कैसे बना सकता हूं? क्या आप लॉक आदेश की व्याख्या करेंगे?

पृष्ठभूमि कार्यकर्ता को तर्क भेजना?

मान लीजिए कि मैं एक पृष्ठभूमि कार्यकर्ता को एक पूर्णांक पैरामीटर भेजना चाहता हूं, यह कैसे पूरा किया जा सकता है?

private void worker_DoWork(object sender, DoWorkEventArgs e) { } 

मुझे पता है कि जब यह कार्यकर्ता होता है। RunWorkerAsync () ;, मैं कार्यकर्ता_DoWork में परिभाषित करने के लिए कैसे समझता हूं कि उसे एक पूर्णांक पैरामीटर नहीं लेना चाहिए

वेब के समाधान से एकत्रित समाधान "पृष्ठभूमि कार्यकर्ता को तर्क भेजना?"

आप इसे इस तरह से शुरू करते हैं:

 int value = 123; bgw1.RunWorkerAsync(value); // argument: value, the int will be boxed 

और फिर

 private void worker_DoWork(object sender, DoWorkEventArgs e) { int value = (int) e.Argument; // the 'argument' parameter resurfaces here ... // and to transport a result back to the main thread double result = 0.1 * value; e.Result = result; } // the Completed handler should follow this pattern // for Error and (optionally) Cancellation handling private void worker_Completed(object sender, RunWorkerCompletedEventArgs e) { // check error, check cancel, then use result if (e.Error != null) { // handle the error } else if (e.Cancelled) { // handle cancellation } else { double result = (double) e.Result; // use it on the UI thread } // general cleanup code, runs when there was an error or not. } 

हालांकि यह एक पहले से ही उत्तरित प्रश्न है, मैं एक और विकल्प छोड़ सकता हूं कि आईएमओ पढ़ने में बहुत आसान है:

 BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (obj, e) => WorkerDoWork(value, text); worker.RunWorkerAsync(); 

और हेन्डलर विधि पर:

 private void WorkerDoWork(int value, string text) { ... } 

आप इस तरह से कई तर्कों को पारित कर सकते हैं।

 List<object> arguments = new List<object>(); arguments.Add(argument 1); arguments.Add(argument 1); arguments.Add(argument n); backgroundWorker2.RunWorkerAsync(arguments); private void worker_DoWork(object sender, DoWorkEventArgs e) { List<object> genericlist = e.Argument as List<object>; extract your multiple arguments from this list and cast them and use them. } 

आप DoWorkEventArgs.Argument संपत्ति का उपयोग कर सकते हैं।

एक पूर्ण उदाहरण (यहां तक ​​कि एक इंट आर्गुमेंट का प्रयोग भी) माइक्रोसॉफ्ट के साइट पर पाया जा सकता है:

  • कैसे करें: पृष्ठभूमि में एक ऑपरेशन को चलाने

DoWorkEventArgs.Argument संपत्ति की जाँच करें:

 ... backgroundWorker1.RunWorkerAsync(yourInt); ... private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // Do not access the form's BackgroundWorker reference directly. // Instead, use the reference provided by the sender parameter. BackgroundWorker bw = sender as BackgroundWorker; // Extract the argument. int arg = (int)e.Argument; // Start the time-consuming operation. e.Result = TimeConsumingOperation(bw, arg); // If the operation was canceled by the user, // set the DoWorkEventArgs.Cancel property to true. if (bw.CancellationPending) { e.Cancel = true; } } 

आपको रनवॉर्कर एसिंक (ऑब्जेक्ट) विधि और DoWorkEventArgs.Argument संपत्ति की आवश्यकता है।

 worker.RunWorkerAsync(5); private void worker_DoWork(object sender, DoWorkEventArgs e) { int argument = (int)e.Argument; //5 } 

आपको हमेशा ऑब्जेक्ट प्रकारों की सूची के बजाय ठोस प्रकार (समग्र डिजाइन पैटर्न का उपयोग करके) के साथ एक समग्र वस्तु का उपयोग करने का प्रयास करना चाहिए। कौन याद करेगा कि उन वस्तुओं में से प्रत्येक वस्तु क्या है? बाद में अपने कोड के रखरखाव के बारे में सोचें … इसके बजाय, ऐसा कुछ करने की कोशिश करें:

 Public (Class or Structure) MyPerson public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public int ZipCode { get; set; } End Class 

और तब:

 Dim person as new MyPerson With { .FirstName = “Joe”, .LastName = "Smith”, ... } backgroundWorker1.RunWorkerAsync(person) 

और फिर:

 private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e) { MyPerson person = e.Argument as MyPerson string firstname = person.FirstName; string lastname = person.LastName; int zipcode = person.ZipCode; } 

यदि आप एक से अधिक प्रकार के तर्कों को पारित करना चाहते हैं, तो आप इसे बाहर की कोशिश कर सकते हैं, पहले उन्हें ऑब्जेक्ट की एक सरणी में जोड़ें और उस ऑब्जेक्ट को RunWorkerAsync () को पास करें एक उदाहरण है:

  some_Method(){ List<string> excludeList = new List<string>(); // list of strings string newPath ="some path"; // normal string Object[] args = {newPath,excludeList }; backgroundAnalyzer.RunWorkerAsync(args); } 

अब पृष्ठभूमि कार्यकर्ता की कार्यप्रणाली पद्धति में

 backgroundAnalyzer_DoWork(object sender, DoWorkEventArgs e) { backgroundAnalyzer.ReportProgress(50); Object[] arg = e.Argument as Object[]; string path= (string)arg[0]; List<string> lst = (List<string>) arg[1]; ....... // do something...... //..... }