[.NET Remoting] Eventhandler en Form controls

Pagina: 1
Acties:

  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
Ik zit met het volgende probleem. Ik heb een client en een server.

Met die client roep ik een methode aan op de server (op het remote object).
Dit object genereert dan een event wat door wordt gestuurd naar alle aangesloten clients.
De clients hebben een eventhandler geregistreerd voor de afhandeling van dit event.

Tot nu toe gaat dat allemaal goed. De methode aanroep en het genereren van het event gaan goed.
Maar als ik in de eventhandler de property van een Form control van de client aanroep (bv. TextBox.Text="test" of Button.Enabled=false) loopt de applicatie vast.

Waarom kan ik geen Form control properties aanroepen in de event handler? Heeft dit iets te maken met het feit dat het event remote wordt getriggerd? En hoe los ik dit op?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Hoezo hij loopt vast? Je krijgt geen exceptie ofzo, je applicatie 'bevriest' gewoon ?

Toon eens wat relevante code.
Toon bv eens hoe je de event triggered in je server, en wat relevante code van de event-handler in de client.

[ Voor 49% gewijzigd door whoami op 21-10-2004 11:36 ]

https://fgheysels.github.io/


  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
De applicatie bevriest inderdaad. Geen exceptie of foutmelding.

Dit is de servermethode en de eventaanroep:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public void RegisterPlayer(string pPlayerName)
        {
            for(int i=0;i<3;i++)
            {
                if (playerInfo[i] == null)
                {
                    PlayerInfo pi = new PlayerInfo();
                    pi.PlayerName = pPlayerName;
                    pi.Score = 0;
                    playerInfo[i] = pi;
                    PlayerRegistered(playerInfo);
                    break;
                }
            }
        }


En dit is de eventhandler aan de clientzijde:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public void OnGsPlayerRegistered(Spel_Server_DLL.PlayerInfo[] pPlayerInfo)
        {
            if (pPlayerInfo[0] != null)
            {
                lblSpeler1.Text = pPlayerInfo[0].PlayerName;
            }
            else
            {
                lblSpeler1.Text = "[leeg]";
            }

            if (pPlayerInfo[1] != null)
            {
                lblSpeler2.Text = pPlayerInfo[1].PlayerName;
            }
            else
            {
                lblSpeler2.Text = "[leeg]";
            }

            if (pPlayerInfo[2] != null)
            {
                lblSpeler3.Text = pPlayerInfo[2].PlayerName;
            }
            else
            {
                lblSpeler3.Text = "[leeg]";
            }
        }

[ Voor 3% gewijzigd door Mottebelke op 22-10-2004 11:05 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Op welke lijn bevriest je app juist ?
Is PlayerInfo een serializable class ?

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Is de thread niet gewoon busy, voer je dit uit in je mainthread?

Druk is op 'break' als het programma bevriest. Bij welke statement blijft hij hangen?

  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
PlayerInfo is serializable, en de applicatie bevriest bij line 5.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Mottebelke schreef op 21 oktober 2004 @ 11:49:
PlayerInfo is serializable, en de applicatie bevriest bij line 5.
Wat staat op line #5?

  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
zie de code hierboven (bij 'lblSpeler1.Text =...' dus)

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

En als je dan een step-in doet loopt hij niet verder?
Heb je ook al gekeken of er anderen Threads lopen? Messchien wacht deze Thread omdat een object gelocked is.

  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
Ook als ik een step in doe gaat hij niet verder bij die line.

Hoe kijk ik welke threads er lopen (ik heb niet zoveel ervaring met threads)?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Ben je zeker dat je geen securityexception krijgt ?
[rml][ .NET] Remoting : SecurityExceptions bij delegates[/rml]

Gaat het hier trouwens over .NET 1.0 of .NET 1.1 ?

[ Voor 17% gewijzigd door whoami op 21-10-2004 12:33 ]

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Mottebelke schreef op 21 oktober 2004 @ 11:55:
Ook als ik een step in doe gaat hij niet verder bij die line.

Hoe kijk ik welke threads er lopen (ik heb niet zoveel ervaring met threads)?
Als je in een break zit in debug mode zit, klik dan: Debug -> ... -> Threads, het is iig bovenste in het menu. Klik dat aan en je ziet de running threads van het moment. En als je er dubbel op klinkt (op een thread) sping je naar de current statement van deze thread.
whoami schreef op 21 oktober 2004 @ 12:13:
Ben je zeker dat je geen securityexception krijgt ?
[rml][ .NET] Remoting : SecurityExceptions bij delegates[/rml]

Gaat het hier trouwens over .NET 1.0 of .NET 1.1 ?
Dan breakt hij toch ook de debugger in, mits je dit niet hebt uitgezet.

  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
Ik heb even naar de threads gekeken op de regel voordat hij freezt. En dan zie ik dat er twee belangrijke threads zijn, namelijk Client.MainForm.OnGsPlayerRegistered en Client.MainForm.btnMaak_Click.

En nu denk ik dat die tweede thread misschien het probleem kan zijn. Zorgt deze ervoor dat de Form controls gelockt worden?

In de btnMaak_Click functie roep ik de remote functie RegisterPlayer aan:
code:
1
2
3
4
5
6
7
8
9
10
11
        private void btnMaak_Click(object sender, System.EventArgs e)
        {
            RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType("Spel_Server_DLL.Main, 
               Spel Server DLL"),"CL_Game",WellKnownObjectMode.Singleton);

            RemoteGame.RegisterGameServer(myIpAddress, myChannelAddress);
            btnMaak.Enabled = false;
            lblStatus.Text = "Je hebt een spel gestart. Wacht op de andere spelers.";

            HostGame.RegisterPlayer(myPlayerName);
        }

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Maak eens een method aan in je remoted object die gewoon een string returned, en test je remoted object eens door gewoon deze method aan te roepen vanuit je client applicatie. (Dus nog niet met events enzo gaan werken).
Werkt het dan ?

Ik heb net even een testje gedaan met events, maar ik krijg een 'Cannot find the assembly' exception.
Ik heb die fout al eens eerder gehad (zie de link naar m'n eerdere topic in dit topic), maar ik zal vanavond of dit weekend thuis eens kijken in de code van m'n projectjes.
Als je events gaat gebruiken met remoted objects in .NET 1.1 moet je wel FormatterSinkProviders gaan meegeven die specifieren dat de TypeLevelFilter op Full staat. (Zie ook het gelinkte topic).

https://fgheysels.github.io/


  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
Ik het even geprobeerd met een remote method die een string returned en daarna die string in het label zet. En dat werkt allemaal.

Dus het probleem lijkt toch iets te zijn met de events/eventhandlers.

En ik heb de BinaryServerFormatterSinkProvider.TypeFilterLevel op Full staan.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Mottebelke schreef op 22 oktober 2004 @ 10:56:


En ik heb de BinaryServerFormatterSinkProvider.TypeFilterLevel op Full staan.
Is je eventhandler public, en je event ook ?

https://fgheysels.github.io/


  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
Jep, die zijn beide public.

  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
* kickje *

Niemand die een idee heeft wat het probleem is?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Mottebelke schreef op 23 oktober 2004 @ 11:35:
* kickje *

Niemand die een idee heeft wat het probleem is?
Owja, ik ging eens wat code opzoeken, maar m'n PC heb ik net verhuisd...

https://fgheysels.github.io/


  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
En whoami, heb je al iets gevonden? Afbeeldingslocatie: http://smile.smilies.nl/2143.gif

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Mottebelke schreef op 25 oktober 2004 @ 11:31:
En whoami, heb je al iets gevonden? [afbeelding]
Nope.... Ik kan momenteel niet bij de pc waar die code opstaat...

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Ik heb net nog ff getest, en ik krijg geen excepties, de applicatie blijft niet hangen, maar m'n delegate wordt wel niet uitgevoerd, wat ik best vreemd vind. Hij is null, dus het lijkt wel ofdat hij niet mee geserializeerd wordt ofzo.

Ik heb dus m'n Player class serializable gemaakt (dmv het Serializable attribute en de ISerializable interface), de class die remoted is, heb ik ook serializable gemaakt.
Ik heb de TypeFilterLevels op Full gezet.

https://fgheysels.github.io/


  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 20-05 16:02
Ik heb nog eens goed naar de code bekeken en het lijkt erop dat de applicatie in iedere eventhandler vastloopt als er een form control wordt aangeroepen (maakt niet uit welke button/label het is).

Het lijkt er dus op dat het niet mogelijk is om bij een remote gegenereerd event de lokale form controls aan te passen.

Kan iemand dit bevestigen of met een eventuele oplossing komen?

[edit]

En om het even volledig te houden (ik weet niet of het iets uitmaakt): het remote object zit in een DLL die in dezelfde solution als de Form applicatie zit.

[ Voor 19% gewijzigd door Mottebelke op 03-11-2004 13:56 ]

Pagina: 1