title: How to update textbox on GUI from another thread
body: <p>I'm new with C# and I'm trying to make a simple client server chat application.</p>
  
  <p>I have RichTextBox on my client windows form and I am trying to update that control from server which is in another class. When I try to do it I get the error: <em>"Cross-thread operation not valid: Control textBox1 accessed from a thread other than the thread it was created on".</em></p>
  
  <p>Here the code of my Windows form:</p>
  
  <pre><code>private Topic topic;  
  public RichTextBox textbox1;  
  bool check = topic.addUser(textBoxNickname.Text, ref textbox1, ref listitems);
  </code></pre>
  
  <p>Topic class:</p>
  
  <pre><code>public class Topic : MarshalByRefObject  
  {  
      //Some code
   public  bool addUser(string user, ref RichTextBox textBox1, ref List&lt;string&gt; listBox1)  
   {  
       //here i am trying to update that control and where i get that exception  
       textBox1.Text += "Connected to server... \n";  
  }
  </code></pre>
  
  <p>So how to do that? How can I update the textbox control from another thread? </p>
  
  <hr>
  
  <p>I'm trying to make some basic chat client/server application using .net remoting.
  I want to make windows form client application and console server application as separate .exe files. Here im trying to call server function AddUser from client and i want to AddUser function update my GUI. Ive modified code as you suggested Jon but now instead of cross-thread exception i've got this exception ... <em>"SerializationException: Type Topic in Assembly is not marked as serializable"</em>.  </p>
  
  <p>Ill post my whole code bellow, will try to keep it simple as possible.<br>
  Any suggestion is welcome. Many thanks.</p>
  
  <p><strong>Server:</strong>  </p>
  
  <pre><code>  namespace Test
  {
      [Serializable]
      public class Topic : MarshalByRefObject
      {
          public bool AddUser(string user, RichTextBox textBox1, List&lt;string&gt; 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();
              }
          }
      }
  
  }  
  </code></pre>
  
  <p><strong>Windows form client:</strong>  </p>
  
  <pre><code>// 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);
  </code></pre>