title: Cross-thread operation not valid. C#
body: <p>I have a class file that sends an integer to my Form2 class which then a function within this class uses the integer to update my picturebox1 image-location and Form2 size.</p>
  
  <p>The integer is a ID of the current map I am in (in a irrelevant game).</p>
  
  <p>Here are the 2 scenarios that play out.</p>
  
  <p>1) Now, if my Form2 is opened prior to the function being executed (due to not in-game yet due to no id) and then the function is executed (due to now being in-game) , I get a System.InvalidOperationException @ the line 'this.Refresh();'.</p>
  
  <p>2) Now, if I leave Form2 unopened, enter the game and then open Form2, the picturebox1 image is now loaded; however, the form size is not updated. If I then hide Form2 and enter a new map (new ID), I get a System.InvalidOperationException @ the line 'this.Size...'. Also, if I do not hide the form in the aforementioned sentence and then enter a new map, I get the same error as in scenario 1.</p>
  
  <p><strong>Code</strong> </p>
  
  <p>The following is my Form2 class file that has the functions which are related to the two errors above.</p>
  
  <pre><code>public partial class Form2 : Form
  {
      #region Imports
  
      [DllImport("kernel32.dll")]
      static extern void OutputDebugString(string lpOutputString);
  
      #endregion
  
      #region Variables
  
      public delegate void UpdateControlsDelegate();
  
      public static Form2 _Form2;
  
      #endregion
  
      public Form2()
      {
          InitializeComponent();
  
          _Form2 = this;
      }
  
      Map map = new Map();
      public void MUpdate(int m)
      {
          OutputDebugString("{MUpdate} map= " + m.ToString());
  
          if (m &lt;= 90000)
          {
              pictureBox1.ImageLocation = "http://randomspam.co/MAP/0000" + m.ToString() + ".img/miniMap.canvas.png";
          }
          else
          {
              if (m &lt;= 900000)
              {
                  pictureBox1.ImageLocation = "http://randomspam.co/MAP/000" + m.ToString() + ".img/miniMap.canvas.png";
              }
              else
              {
                  if (m &lt;= 9000000)
                  {
                      pictureBox1.ImageLocation = "http://randomspam.co/MAP/00" + m.ToString() + ".img/miniMap.canvas.png";
                  }
                  else
                  {
                      pictureBox1.ImageLocation = "http://randomspam.co/MAP/" + m.ToString() + ".img/miniMap.canvas.png";
                  }
              }
          }
  
          FUpdate();
  
          try
          {
              toolTip1.SetToolTip(pictureBox1, map[m]);
          }
          catch
          { 
  
          }
      }
  
      public void InvokeUpdateControls()
      {
          if (this.InvokeRequired)
          {
              this.Invoke(new UpdateControlsDelegate(FUpdate));
          }
          else
          {
              FUpdate();
          }
      }
  
      private void FUpdate()
      {
          this.Size = new Size(pictureBox1.Width + 6, pictureBox1.Height + 24);
  
          this.Refresh();
      }
  }
  </code></pre>
  
  <p><strong>Errors</strong></p>
  
  <p>Here are the errors that will be related to the 2 scenarios above.</p>
  
  <p>1) </p>
  
  <pre>
    System.InvalidOperationException was unhandled
    HResult=-2146233079
    Message=Cross-thread operation not valid: Control 'form2' accessed from a thread other than the thread it was created on.
    Source=System.Windows.Forms
    StackTrace:
         at System.Windows.Forms.Control.get_Handle()
         at System.Windows.Forms.Control.Invalidate(Boolean invalidateChildren)
         at System.Windows.Forms.Control.Refresh()
         at sorprendente.Form2.FUpdate() in C:\Users\Andrew\Documents\Visual Studio 2010\Projects\MSC\sorprendente\Form2.cs:line 93
         at sorprendente.Form2.MUpdate(Int32 m) in C:\Users\Andrew\Documents\Visual Studio 2010\Projects\MSC\sorprendente\Form2.cs:line 65
         at sorprendente.FInteraction.FMTransfer(Int32 m) in C:\Users\Andrew\Documents\Visual Studio 2010\Projects\MSC\sorprendente\Pipes.cs:line 272
         at sorprendente.PInteraction.ReadPipe() in C:\Users\Andrew\Documents\Visual Studio 2010\Projects\MSC\sorprendente\Pipes.cs:line 204
         at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
         at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
         at System.Threading.ThreadHelper.ThreadStart()
    InnerException: 
  </pre>
  
  <p>2) </p>
  
  <pre>
    System.InvalidOperationException was unhandled
    HResult=-2146233079
    Message=Cross-thread operation not valid: Control 'form2' accessed from a thread other than the thread it was created on.
    Source=System.Windows.Forms
    StackTrace:
         at System.Windows.Forms.Control.get_Handle()
         at System.Windows.Forms.Control.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
         at System.Windows.Forms.Form.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
         at System.Windows.Forms.Control.SetBounds(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
         at System.Windows.Forms.Control.set_Size(Size value)
         at System.Windows.Forms.Form.set_Size(Size value)
         at sorprendente.Form2.FUpdate() in C:\Users\Andrew\Documents\Visual Studio 2010\Projects\MSC\sorprendente\Form2.cs:line 91
         at sorprendente.Form2.MUpdate(Int32 m) in C:\Users\Andrew\Documents\Visual Studio 2010\Projects\MSC\sorprendente\Form2.cs:line 65
         at sorprendente.FInteraction.FMTransfer(Int32 m) in C:\Users\Andrew\Documents\Visual Studio 2010\Projects\MSC\sorprendente\Pipes.cs:line 272
         at sorprendente.PInteraction.ReadPipe() in C:\Users\Andrew\Documents\Visual Studio 2010\Projects\MSC\sorprendente\Pipes.cs:line 204
         at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
         at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
         at System.Threading.ThreadHelper.ThreadStart()
    InnerException: 
  </pre>
  
  <p>I clearly do not understand how to bypass these errors, so any information regarding on how to fix my current problem will be appreciated.</p>
  
  <p>If you request to see any additional class files/functions that may be related to the error, I am more than willing to post them.</p>