[c#] asynchrone events komen niet aan.

Pagina: 1
Acties:

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
Ik heb een applicatie waar een thread wat netwerkspul afhandelt. Nu wil ik vanuit die thread events sturen naar mijn gui. Daarvoor gebruik ik de volgende code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
delegate void NetworkEvent();

private void FireThreadSafeEvent(NetworkEvent ev)
{
   if (ev == null) return;

   if (ev.Target is Control) // moet eigenlijk ISynchronizeInvoke zijn
   {
       Control tgt = (Control)(ev.Target);
       tgt.Invoke(onData);
   }
   else
   {
       ev();
   }
}

Echter, als ik de event fire, dan komt 'ie nooit bij de gui aan.
Als ik gewoon ev() aanroep, dan komt de event wel aan, maar in de verkeerde thread. Mijn guithread functioneert verder normaal.

Wie weet wat ik fout doe?

Localhost, sweet localhost


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 19:09

pjvandesande

GC.Collect(head);

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void FireThreadSafeEvent(NetworkEvent ev) 
{ 
   if (ev == null) return; 

   Control target = ev.Target as Control;

   if (target != null && target.InvokeRequired)
   { 
       target .Invoke(onData); 
   } 
   else 
   { 
       ev(); 
   } 
}


Sowieso is het netjes om op InvokeRequired te controleren, maar ik snap je probleem niet echt. Word er nooit geinvoked of als er geinvoked word treden er problemen op?

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
Er wordt niet geinvoked, en er treden geen errors op, ook niet met jou code.
De network-thread blockt op de Invoke-call, maar de event in de gui-thread wordt nooit geinvoked.

Localhost, sweet localhost


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:54
Waarom doe je :

code:
1
target.Invoke(onData);

en niet
code:
1
target.Invoke (ev);

?

https://fgheysels.github.io/


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
zit je niet in een deadlock situatie? Dan kan je bijv. InvokeLater gebruiken om het op te lossen.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
whoami schreef op donderdag 25 augustus 2005 @ 12:04:
Waarom doe je :

code:
1
target.Invoke(onData);

en niet
code:
1
target.Invoke (ev);

?
Aaaarrrg... Ik zit het verkeerde event te invoken. Slordig trouwens dat dotnet hier geen melding voor geeft, want onData heeft heel andere parameters dan ev.

Maargoed: whoami.kudus++;

Localhost, sweet localhost


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:54
Mja, hij kan er op dat moment niet echt een melding van geven.

Invoke neemt gewoon een delegate als parameter, en het doet erniet van welk type die is. De parameters geef je trouwens mee als een object array.

https://fgheysels.github.io/


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Infinitive schreef op donderdag 25 augustus 2005 @ 12:10:
zit je niet in een deadlock situatie? Dan kan je bijv. InvokeLater gebruiken om het op te lossen.
Je bent waarschijnlijk in de war met Java, want .NET kent geen InvokeLater. Wel BeginInvoke, waarmee je ongeveer hetzelfde effect bereikt.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?

Pagina: 1