Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB.Net 2.0]Cross-Thread probleem icm met events

Pagina: 1
Acties:
  • 362 views sinds 30-01-2008
  • Reageer

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Ik ben bezig met een Multi-threaded socket-wrapper. De tweede thread kijkt iedere keer of er data te halen van de socket, en vuurt dan een event af.

Het probleem hiermee is dat je dan een cross-thread warning krijgt als je vanuit dat event iets vanuit je form wilt aanpassen:

Visual Basic:
1
2
3
    Private Sub sock_DataArrival(ByVal BytesReceived As Long) Handles sock.DataArrival
        tbLog.AppendText("<--" & sock.getData().ToString & vbCrLf)
    End Sub


Dit snap ik ook, omdat forms niet thread-safe zijn. Normaal zou je dit oplossen met delegates en form.invoke().

Het probleem is dat ik geen referentie heb vanuit mijn socketclass naar de form (en dat lijkt me ook niet echt handig dat als je multithreading gebruikt in je class, je in eens wel een referentie naar je form nodig hebt).

Is er een makkelijke manier om dat makkelijk op te lossen? Ik heb al op google gezocht, maar daar gebruiken ze overal een referentie naar de form met invoke().

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:08
Bij het afvuren van het event kan je toch nagaan of er moet ge-invoked worden ?
Kijk eens naar de Target property van je event, naar ISynchronizeInvoke, etc...

code:
1
2
3
4
5
6
7
8
protected void OnFireEvent()
{
    ISynchronizeInvoke t = TheEvent.Target as ISynchronizeInvoke;

    if( t != null && t.InvokeRequired )
    {
    }
}


Maar, om heel goed te zijn, zou je er eigenlijk rekening moeten mee houden dat er meerdere eventhandlers aan je event kunnen hangen, en zou je per eventhandler moeten kijken of er moet geinvoked worden.

[ Voor 54% gewijzigd door whoami op 13-01-2008 13:02 ]

https://fgheysels.github.io/


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Ik heb dit artikel daarover gevonden:

http://vbcity.com/forums/...&cat=Threading&#TID141554

Het probleem wat ik hier mee heb is dat je apart een delegate moet doorgeven. Is het ook mogelijk om dit met het simpele event systeem van vb.net te doen?

In vb.net kun je heel simpel handles class.event doen, of met addhandler de delegate automatisch aan maken. Zou hier custom events van pas kunnen komen?

  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 01-07-2023
compufreak88 schreef op zondag 13 januari 2008 @ 13:26:
Ik heb dit artikel daarover gevonden:

http://vbcity.com/forums/...&cat=Threading&#TID141554

Het probleem wat ik hier mee heb is dat je apart een delegate moet doorgeven. Is het ook mogelijk om dit met het simpele event systeem van vb.net te doen?

In vb.net kun je heel simpel handles class.event doen, of met addhandler de delegate automatisch aan maken. Zou hier custom events van pas kunnen komen?
Events werken op de achtergrond op met Delegates, zij het wat meer verborgen (al helemaal in vb.net). in Vb.Net kun je bij de delegate komen door [Eventnaam]Event. (Let op de intellisense verbergt deze!

Met DataArrivalEvent.GetInvocationList kun je dan bijvoorbeeld bepalen welke handlers er aan het event gekoppeld zijn. Deze geeft een array van delegates terug.

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Serpie schreef op zondag 13 januari 2008 @ 13:33:
[...]


Events werken op de achtergrond op met Delegates, zij het wat meer verborgen (al helemaal in vb.net). in Vb.Net kun je bij de delegate komen door [Eventnaam]Event. (Let op de intellisense verbergt deze!

Met DataArrivalEvent.GetInvocationList kun je dan bijvoorbeeld bepalen welke handlers er aan het event gekoppeld zijn. Deze geeft een array van delegates terug.
Ah, bedankt, dit werkt nu.
whoami schreef op zondag 13 januari 2008 @ 12:59:
[..]
Maar, om heel goed te zijn, zou je er eigenlijk rekening moeten mee houden dat er meerdere eventhandlers aan je event kunnen hangen, en zou je per eventhandler moeten kijken of er moet geinvoked worden.
Moet dat dan doormiddel van de InvocationList?

Ik heb de code nu zo:

Dit staat in de functie die de thread uitvoert
Visual Basic:
1
2
3
4
5
6
7
                    Dim dar As New DataArrivalRaiser(AddressOf RaiseDataArrival)
                    If TypeOf DataArrivalEvent.Target Is Form Then
                        Dim frm As Form = CType(DataArrivalEvent.Target, Form)
                        If frm.InvokeRequired Then
                            frm.Invoke(dar, client.ReceiveBufferSize)
                        End If
                    End If


RaiseDataArrival is een functie die dan RaiseEvent aanroept.

[ Voor 47% gewijzigd door compufreak88 op 14-01-2008 09:29 ]