Come aggiornare la casella di testo sulla GUI da un altro thread

Sono nuovo con C # e sto cercando di fare una semplice applicazione di chat client server.

Ho RichTextBox sul mio modulo Windows client e sto cercando di aggiornare quel controllo dal server che si trova in un’altra class. Quando provo a farlo, viene visualizzato l’errore: “Operazione cross-thread non valida: control textBox1 accessibile da un thread diverso dal thread su cui è stato creato”.

Ecco il codice del mio modulo di Windows:

private Topic topic; public RichTextBox textbox1; bool check = topic.addUser(textBoxNickname.Text, ref textbox1, ref listitems); 

Classe di argomenti:

 public class Topic : MarshalByRefObject { //Some code public bool addUser(string user, ref RichTextBox textBox1, ref List listBox1) { //here i am trying to update that control and where i get that exception textBox1.Text += "Connected to server... \n"; } 

Quindi come farlo? Come posso aggiornare il controllo della casella di testo da un altro thread?


Sto cercando di creare un’applicazione client / server di chat di base utilizzando la rete remota. Voglio fare in modo che Windows formi l’applicazione client e l’applicazione console server come file .exe separati. Qui sto cercando di chiamare la funzione server AddUser dal client e voglio aggiungere la funzione AddUser alla mia GUI. Ho modificato il codice come suggerito Jon ma ora invece di eccezione cross-thread ho questa eccezione … “SerializationException: Type Topic in Assembly non è marcato come serializzabile” .

Ill posterò tutto il mio codice, cercherò di renderlo il più semplice ansible.
Qualsiasi suggerimento è benvenuto. Grazie molto.

Server:

  namespace Test { [Serializable] public class Topic : MarshalByRefObject { public bool AddUser(string user, RichTextBox textBox1, List listBox1) { //Send to message only to the client connected MethodInvoker action = delegate { textBox1.Text += "Connected to server... \n"; }; textBox1.BeginInvoke(action); //... return true; } public class TheServer { public static void Main() { int listeningChannel = 1099; BinaryServerFormatterSinkProvider srvFormatter = new BinaryServerFormatterSinkProvider(); srvFormatter.TypeFilterLevel = TypeFilterLevel.Full; BinaryClientFormatterSinkProvider clntFormatter = new BinaryClientFormatterSinkProvider(); IDictionary props = new Hashtable(); props["port"] = listeningChannel; HttpChannel channel = new HttpChannel(props, clntFormatter, srvFormatter); // Register the channel with the runtime ChannelServices.RegisterChannel(channel, false); // Expose the Calculator Object from this Server RemotingConfiguration.RegisterWellKnownServiceType(typeof(Topic), "Topic.soap", WellKnownObjectMode.Singleton); // Keep the Server running until the user presses enter Console.WriteLine("The Topic Server is up and running on port {0}", listeningChannel); Console.WriteLine("Press enter to stop the server..."); Console.ReadLine(); } } } } 

Client del modulo Windows:

 // Create and register a channel to communicate to the server // The Client will use the port passed in as args to listen for callbacks BinaryServerFormatterSinkProvider srvFormatter = new BinaryServerFormatterSinkProvider(); srvFormatter.TypeFilterLevel = TypeFilterLevel.Full; BinaryClientFormatterSinkProvider clntFormatter = new BinaryClientFormatterSinkProvider(); IDictionary props = new Hashtable(); props["port"] = 0; channel = new HttpChannel(props, clntFormatter, srvFormatter); //channel = new HttpChannel(listeningChannel); ChannelServices.RegisterChannel(channel, false); // Create an instance on the remote server and call a method remotely topic = (Topic)Activator.GetObject(typeof(Topic), // type to create "http://localhost:1099/Topic.soap" // URI ); private Topic topic; public RichTextBox textbox1; bool check = topic.addUser(textBoxNickname.Text,textBox1, listitems);