Visual Basic .NET Language
BackgroundWorker
खोज…
BackgroundWorker का उपयोग करना
पृष्ठभूमि कार्यकर्ता के साथ एक कार्य निष्पादित करना।
टूलबॉक्स से BackgroundWorker
नियंत्रण पर डबल क्लिक करें
इसे जोड़ने के बाद BackgroundWorker कैसे दिखाई देता है।
BackgroundWorker1_DoWork
ईवेंट प्राप्त करने के लिए अतिरिक्त नियंत्रण पर डबल क्लिक करें और जब बैकग्राउंडर को कॉल किया जाए तो कोड को निष्पादित किया जाए। कुछ इस तरह:
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'Do the time consuming background task here
End Sub
कार्य करने के लिए BackgroundWorker को कॉल करना किसी भी घटना जैसे कि Button_Click
, Textbox_TextChanged
, आदि पर किया जा सकता है।
BackgroundWorker1.RunWorkerAsync()
इस प्रकार के रूप में BackgroundWorker के कार्य समाप्त घटना पर कब्जा करने के लिए RunWorkerCompleted
घटना को संशोधित करें:
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MsgBox("Done")
End Sub
यह एक संदेश बॉक्स प्रदर्शित करेगा जिसमें कहा Done
कि जब कार्यकर्ता उसे सौंपे गए कार्य को पूरा करेगा।
BackgroundWorker में GUI घटकों को एक्सेस करना
आप BackgroudWorker से किसी भी GUI घटक का उपयोग नहीं कर सकते। उदाहरण के लिए यदि आप ऐसा कुछ करने की कोशिश करते हैं
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
TextBox1.Text = "Done"
End Sub
आपको यह कहते हुए एक रनटाइम त्रुटि प्राप्त होगी कि "क्रॉस-थ्रेड ऑपरेशन मान्य नहीं है: नियंत्रण 'TextBox1' उस थ्रेड के अलावा किसी थ्रेड से एक्सेस किया गया था जिस पर इसे बनाया गया था।"
ऐसा इसलिए है क्योंकि BackgroundWorker आपके कोड को मुख्य धागे के समानांतर दूसरे धागे पर चलाता है, और GUI घटक थ्रेड-सुरक्षित नहीं हैं। आपको अपना कोड Invoke
विधि का उपयोग करके मुख्य थ्रेड पर चलाने के लिए सेट करना होगा, इसे एक प्रतिनिधि दे:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub
या आप BackgroundWorker के ReportProgress विधि का उपयोग कर सकते हैं:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
Me.BackgroundWorker1.ReportProgress(0, "Done")
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
Me.TextBox1.Text = DirectCast(e.UserState, String)
End Sub