 <p>UI Controls are thread agnostic (need to be updated on a thread which created the control). In your case, you are running a new thread which is calling a method which seems to be updating a UI control (dataGridView1).</p> <p>As a quick reference: read about the Control.BeginInvoke (<a href="http://msdn.microsoft.com/en-us/library/0b1bf3y3(v=vs.110).aspx" rel="nofollow">MSDN</a>).</p> <p>Plus, this question is similar to yours: <a href="http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the?rq=1">Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on</a></p> <p>Edit: The method/statement which is update DataGridView needs to be run on UI thread. Something like this:</p> <pre><code>private void RunProgram() { //Do time consuming work here (non-UI thread) dataGridView1.BeginInvoke(new InvokeDelegate(AttachData)); } private void AttachData() { //dataGridView1.Table.... Bind data here (this method would be executed on UI thread) } </code></pre>