खोज…


Control.Invoke () का उपयोग करके थ्रेड-सुरक्षित कॉल करना

Control.Invoke() पद्धति का उपयोग करके आप एक विधि या फ़ंक्शन को पृष्ठभूमि थ्रेड से उस थ्रेड तक ले जा सकते हैं जिस पर नियंत्रण बनाया गया था, जो आमतौर पर UI (उपयोगकर्ता इंटरफ़ेस) थ्रेड है। ऐसा करने से आपका कोड इसके बजाय नियंत्रण के थ्रेड पर चलने के लिए कतारबद्ध हो जाएगा, जो समवर्ती की संभावना को हटा देता है।

यह निर्धारित करने के लिए कि क्या आप को आह्वान करने की आवश्यकता है, या यदि कोड पहले से ही नियंत्रण के रूप में एक ही थ्रेड पर चल रहा है, यह निर्धारित करने के लिए Control.InvokeRequired प्रॉपर्टी की भी जाँच की जानी चाहिए।

Invoke() विधि एक प्रतिनिधि को इसके पहले पैरामीटर के रूप में लेती है। एक प्रतिनिधि संदर्भ, पैरामीटर सूची और रिटर्न प्रकार को दूसरी विधि पर रखता है।

विज़ुअल बेसिक 2010 (10.0) या उच्चतर में, लैम्बडा एक्सप्रेशन का उपयोग मक्खी पर एक प्रतिनिधि विधि बनाने के लिए किया जा सकता है:

If LogTextBox.InvokeRequired = True Then
    LogTextBox.Invoke(Sub() LogTextBox.AppendText("Check passed"))
Else
    LogTextBox.AppendText("Check passed")
End If

जबकि विज़ुअल बेसिक 2008 (9.0) या उससे कम में, आपको प्रतिनिधि को स्वयं घोषित करना होगा:

Delegate Sub AddLogText(ByVal Text As String)

If LogTextBox.InvokeRequired = True Then
    LogTextBox.Invoke(New AddLogText(AddressOf UpdateLog), "Check passed")
Else
    UpdateLog("Check passed")
End If

Sub UpdateLog(ByVal Text As String)
    LogTextBox.AppendText(Text)
End Sub

Async / Await का उपयोग करके थ्रेड-सुरक्षित कॉल करना

यदि हम एक अलग थ्रेड से UI थ्रेड पर किसी ऑब्जेक्ट को बदलने का प्रयास करते हैं, तो हमें एक क्रॉस-थ्रेड ऑपरेशन अपवाद मिलेगा:

Private Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
    ' Cross thread-operation exception as the assignment is executed on a different thread
    ' from the UI one:
    Task.Run(Sub() MyButton.Text = Thread.CurrentThread.ManagedThreadId)
End Sub

VB 14.0 और .NET 4.5 से पहले समाधान यूआई थ्रेड पर रहने वाले और ऑब्जेक्ट पर असाइनमेंट को लागू कर रहा था:

Private Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
    ' This will run the conde on the UI thread:
    MyButton.Invoke(Sub() MyButton.Text = Thread.CurrentThread.ManagedThreadId)
End Sub

VB 14.0 के साथ, हम एक अलग थ्रेड पर Task चला सकते हैं और फिर निष्पादन पूरा होने के बाद संदर्भ को बहाल कर सकते हैं और फिर Async / Await के साथ असाइनमेंट निष्पादित करते हैं:

Private Async Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
    ' This will run the code on a different thread then the context is restored
    ' so the assignment happens on the UI thread:
    MyButton.Text = Await Task.Run(Function() Thread.CurrentThread.ManagedThreadId)
End Sub


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow