login  Naam:   Wachtwoord: 
Registreer je!
 Forum

TCPIPsocket/Thread: Cross-thread operation not valid (Opgelost)

Offline tomdilen - 12/05/2009 19:34 (laatste wijziging 12/05/2009 20:23)
Avatar van tomdilenLid beste sitemasters,


ik zit met een probleempje, ik heb een class TDS_server gemaakt welke (in dit voorbeeld) enkel maar naar een nieuwe clientconnectie luisterd.
Indien deze een clientRequest ontvangt zou deze class een event moeten afvuren, dit gebeurd dan ook zoals bedoeld.
TDS_server.cs

nu wil ik in de formclasse het event opvangen, deze gebeurd goed als ik het resultaat laat zien in een messagebox, maar als ik deze add bij een listbox dan krijg ik de volgende fout:
[error=C#]Cross-thread operation not valid: Control 'lstConnecties' accessed from a thread other than the thread it was created on[/error]
Form1.cs

ik weet dat het iets is met de methode Invoke vanuit de mainThread maar ik geraak er niet uit hoe ik deze zou moeten implementeren. Het liefst zou ik deze dan ook als blackbox in de class TDS_server implementere zodat later niet teveel rotzooi in men formclasse heb.

hieralvast het gehele projectje

--
heb ondertussen ontdekt dat deze fout zich niet optreed als ik start zonder debugging, wat is het verschil tussen opstarten met of zonder debugging, kan het kwaad als ik deze code zo laat voor wat het is? vanuit het exe bestand doet hij ook wat ik vraag.
--

Alvast bedankt
mvg Tom

13 antwoorden

Gesponsorde links
Offline Koen - 12/05/2009 20:14
Avatar van Koen PHP expert Dit komt volgens mij door je access modifiers 

Maak van je "private void OnNewConnectionEventHandler(int i)" eens "public void OnNewConnectionEventHandler(int i)" 
Offline tomdilen - 12/05/2009 20:32
Avatar van tomdilen Lid hey sliphead,

merciekes voor uw vroege reactie
ik heb het geprobeerd om public te maken, maar dat werkt niet, het zou me tevens verbazen ook -> OnNewConnectionEventHandler(int i)" word nooit buiten de form aangeroepen he. 

trouwens... ik heb onderaan mijn probleem nog wat toegevoegd wat ik zojuist ontdekte, als het geen erg kan dan mag het voor mij zo wel blijven.

toch vriendelijk bedankt. groetjes
Offline Koen - 12/05/2009 20:49
Avatar van Koen PHP expert My bad, verkeerd gelezen 
Offline Abbas - 12/05/2009 20:53
Avatar van Abbas Gouden medaille

Crew .NET
Vanuit de code (het projectje) dat jij gaf is er geen fout te bekennen tijdens het Debuggen! Misschien moet je eens meer code of andere code geven waarbij die fout eventueel wel optreedt bij het Debuggen. 
Offline tomdilen - 12/05/2009 21:11 (laatste wijziging 12/05/2009 21:28)
Avatar van tomdilen Lid hoi titjes,

[edit]

ja da was ik natuurlijk vergeten he. kan je zonder client natuurlijk niet testen. hieronder kan je het project downloaden.
na tds_server project te runnen gewoon bij chatclient op connectern klikken.

ChatClientproject.rar

of hier het exe bestand
ChatClientExe.rar

mvg Tom
Offline Abbas - 12/05/2009 21:35
Avatar van Abbas Gouden medaille

Crew .NET
http://msdn.mic...71728.aspx

Het is een hele brok om te lezen, maar ik heb het een groot stuk gelezen en ik denk dat je hier wel zeker mee verder kan! 
Offline tomdilen - 12/05/2009 21:44
Avatar van tomdilen Lid maar "start without debugging" of de exe zelf geeft geen foutmelding!!!! kan ik die code dan niet gewoon laten zoals het is, of kan deze uiteindelijk voor problemen zorgen..

Ik begrijp eigelijk niet goed het verschil tussen met of zonder debugging uitvoeren...

Offline Abbas - 12/05/2009 21:51 (laatste wijziging 12/05/2009 21:51)
Avatar van Abbas Gouden medaille

Crew .NET
Dit las ik op de ASP.NET Forums na een beetje zoeken op Google:
reply schreef:
tart with debugging, is the option, wherein you can pause the procesing of the code, at a certain break point, and then iterate through each step of the code, usually to check the processing of data. This method is usually helpful, when you do not get any error from the code, but the results are far from desired or expected. You can check the values of each variable, and properties of class while debugging.

Start without debugging, is to emulate the exact processing of the code. It is one single process, which gives you only the output, and you might now know the value of the variables during the processing, with the exceptions of using Response.Write(VariableName) at certain stages!

Apart from this difference, there is not other difference in the process!
Offline tomdilen - 12/05/2009 22:14
Avatar van tomdilen Lid t zijn raar toestanden als je het mij vraagt...
Ik laat het voor wat het is in de code, testen ons programmake dan maar verder zonder debugging he 

als het ooit problemen geeft dan kom ik terug 

@titjes @ sliphead: bedankt voor de snelle reacties,

denk dat dit nog wel even mag open blijven

groetjes
Offline Abbas - 12/05/2009 22:17 (laatste wijziging 12/05/2009 22:18)
Avatar van Abbas Gouden medaille

Crew .NET
Geen enkel probleem! Tenzij je probleem over iets anders gaat, dan moet je een nieuw topic openen! 
Offline tomdilen - 12/05/2009 23:22
Avatar van tomdilen Lid opgelost... maar kan beter

If you use multithreading to improve the performance of your Windows Forms applications, you must make sure that you make calls to your controls in a thread-safe way.
Access to Windows Forms controls is not inherently thread safe. If you have two or more threads manipulating the state of a control, it is possible to force the control into an inconsistent state. Other thread-related bugs are possible, such as race conditions and deadlocks. It is important to make sure that access to your controls is performed in a thread-safe way.
It is unsafe to call a control from a thread other than the one that created the control without using the Invoke method


Het was dus niet veilig genoeg om de code zo te laten, het spijtige van de zaak is wel dat er toch meer code in de formclasse vereist, is, en daar houd ik niet van, maarja

ipv zo is het nu spijtig genoeg zo geworden.

moest er iemand een manier vinden om het toch in de TDS_server class te incapselen, zou heel gemakkelijk zijn, maar heb men twijfels als het kan.
Offline Abbas - 12/05/2009 23:25
Avatar van Abbas Gouden medaille

Crew .NET
Zoveel meer code is het toch niet! En jah, je moet veilig werken! 
Offline tomdilen - 13/05/2009 00:00
Avatar van tomdilen Lid 't valt nog mee maar ik hou gewoon nie van spaghetti-code, liever de bussines-logica ergens anders wegstoppen.
idd veilig werken is belangrijker.
blij dat ik toch de moeite heb gedaan om jouw link te bestuderen, 't was nie weinig maar we leren er elke keer weer wa meer van he.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.179s