Avatar billede alex_sleiborg Nybegynder
11. januar 2006 - 11:31 Der er 4 kommentarer og
1 løsning

Mærkelig fejl under runtime

Jeg får denne fejl under runtime, når en klient logger på min server

Cross-thread operation not valid: Control 'lbl_Clientsconn' accessed from a thread other than the thread it was created on.

I denne her metode

public void OnClientConnect(IAsyncResult asyn)
        {
            try
            {
                m_workerSocket[m_clientCount] = m_mainSocket.EndAccept(asyn);
                WaitForData(m_workerSocket[m_clientCount]);
                ++m_clientCount;
                m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
                this.lbl_Clientsconn.Text = m_clientCount.ToString(); //Det er denne her linje der er problemer med
               
            }
            catch (ObjectDisposedException)
            {
                System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: Socket has been closed\n");
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
           
        }
Avatar billede bennytordrup Nybegynder
11. januar 2006 - 11:38 #1
Du laver dødssynden i forbindelse med opdatering af GUI fra en anden tråd. OnClientConnect bliver ikke kaldt fra den samme tråd, som det brugerinterface kaldes i - derfor får du den fejl.

Nedenstående er kastet lige ud af hukommelsen – det er IKKE testet, men det er princippet i det, der skal bruges. Ideen er, at InvokeRequired angiver, om metoden aktuelt bliver afviklet på GUI-tråden eller ej. Hvis den gør, er der ikke noget problem i at røre GUI-kontroller. Hvis den ikke gør, skal der laves et kald ind på GUI-tråden.

public delegate void SetClientsconnTextDelegate(string text);

public DoSetClientsconnText(string text) {
  if (this.InvokeRequired) {
    SetClientsconnTextDelegate del = new SetClientsconnTextDelegate(this.DoSetClientsconnText);
    del.Invoke(new object[] { text });
  }
  else
    this.lbl_Clientsconn.Text = text;
}
Avatar billede alex_sleiborg Nybegynder
11. januar 2006 - 11:51 #2
Okay er det så der man kan bruge delegates til noget? Har nemlig aldrig brugt det før
Avatar billede alex_sleiborg Nybegynder
11. januar 2006 - 11:57 #3
Jeg får compiler fejl her

del.Invoke(new object[] { text });

Error    3    Argument '1': cannot convert from 'object[]' to 'string'    C:\Documents and Settings\Administrator\Dokumenter\Visual Studio 2005\Projects\LoginSystem2005\LoginSystem2005\Connection.cs    142    49    LoginSystem2005

Da jeg ikke rigtig aner hvad der sker, kan jeg ikke rigtig rette fejlen
Avatar billede bennytordrup Nybegynder
11. januar 2006 - 12:50 #4
Prøv at ændre således:

public void DoSetClientconnText(string aText) {
  if (this.InvokeRequired)
    this.Invoke(new SetClientsconnTextDelegate(this.DoSetClientsconnText), new object[] { aText });
  else
    this.lbl_Clientsconn.Text = aText;
}
Avatar billede alex_sleiborg Nybegynder
11. januar 2006 - 12:58 #5
Det virker nu. Mange tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester