title: Cross-thread operation not valid: Control 'textbox' accessed from a thread other than the thread it was created on
body: <p>I need some help. I started c# and not very familiar with event handling and threading yet. As a beginner and as time and exposure progresses, I would like to learn more on these advanced topics and improved and hope all of you here can help me.</p>
  
  <p>I ran onto this problem of "Cross-thread operation not valid: Control 'textbox control called stackStatus' accessed from a thread other than the thread it was created on". I have tried to troubleshoot this whole day but simply no avail. I am stuck. :-( The program hits an exception and cannot continue to execute smoothly.</p>
  
  <p>I have read the following threads and tried a few things but I guess I am still missing something. Appreciate if someone can help me out here. Thanks.</p>
  
  <p><a href="https://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the">Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on</a></p>
  
  <p><a href="https://stackoverflow.com/questions/10775367/cross-thread-operation-not-valid-control-textbox1-accessed-from-a-thread-othe">Cross-thread operation not valid: Control &#39;textBox1&#39; accessed from a thread other than the thread it was created on</a></p>
  
  <p>Here's are most of the portion of the code:</p>
  
  <pre><code>  private void createCloud_Click(object sender, EventArgs e)
      {
          CreateCloud(); //start creation method
          stackStatus.Text = "Creating stack..."; //updates the cloud status textbox
          stackStatus.Refresh();
          Cursor.Current = Cursors.WaitCursor; //change the cursor to wait state
          Start_Describestack(); //call describe method to find out the status of cloud creation progress
  
          Task.Delay(12000); // wait 12s in case not ready
  
          Start_Describestack(); // call again describe method to find out the cloud creation progress status
          Cursor.Current = Cursors.Default; //put cursor on wait
          describeevents(); // call method to get all cloud creation event data and publish on the datagridview
  
      }
  
  
  
      private void Start_Describestack()
      {
          //method making use of timer to call 
  
          _timer = new System.Timers.Timer(15000);
          _timer.Elapsed += new ElapsedEventHandler(describeStack);
          _timer.Enabled = true;
  
  
      }
  
      delegate void describeStackCallBack(object sender, ElapsedEventArgs e);
  
      private void describeStack(object sender, ElapsedEventArgs e)
      {
          //this method makes api calls through cloudclient to describe the stack
          //this is where the "Cross-thread operation not valid: Control 'stackStatus' accessed from a thread other than the thread it was created on"
  
  
          var client = new cloudclient();
          var request2 = new StacksRequest();
  
          request2.Cloudstackname = stackid;
  
          try
          {
              var response = client.DescribeCloudStacks(request2);
  
              foreach (var stack in response.Stacks)
              {
  
              //something is wrong here but I do not know how to fix it. Please help
                  if (this.stackStatus.InvokeRequired)
                  {
                      describeStackCallBack d = new describeStackCallBack(describeStack);
                      this.Invoke(d, new object[] { sender, e });
                      stackStatus.Refresh();
                      describevents();
                  }
                  else
                  {
                      stackStatus.Text = stack.StackStatus;
                      stackStatus.Refresh();
                      describeevents();
                  }
              }
          }
          catch (Exception)
          {
  
              if (this.stackStatus.InvokeRequired)
              {
                  describeStackCallBack d = new describeStackCallBack(describeStack);
                  this.Invoke(d, new object[] { sender, e });
  
                  stackStatus.Text = "Stack not found/Deleted";
              }
              else
              { stackStatus.Text = "Stack not found/Deleted"; }
          }
  
       describeevents();
      }
  
      private void describeevents()
      {
  
  
          var newclient = new cloudclient();
          var request3 = new eventrequest();
  
          request3.Cloudstackname = stackid;
  
  
              try
              {
                  var response = newclient.eventstack(request3);
                  dataGridView3.Rows.Clear();
  
                  foreach (var events in response.sevents)
                  {
                      dataGridView3.Rows.Add(events.Timestamp, events.ResourceStatus, events.ResourceType);
                  }
              }
              catch (Exception)
              {
                  dataGridView3.Rows.Clear();
                  MessageBox.Show("Stack not ready!");
              }
  
          dataGridView3.Refresh();
  
      }
  </code></pre>