You are modifying a winform control in a different thread than the one that created this control (main user interface thread). Winform controls are not thread safe and usually throw an exception if you change your state from any thread other than the one that created it.
You can accomplish this using the InvokeRequired property and the BeginInvoke method found in the Form or control object.
For example, something like this:
private void procExit(object sender, EventArgs e)
{
MessageBox.Show("YAY", "WOOT");
Thread.Sleep(2000);
processComplete(new ProcessStatus { Success = true });
}
private void processComplete(ProcessStatus status)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action<ProcessStatus>(this.processComplete), status);
}
else
{
if (status.Success)
{
}
else
{
}
launchbutton.Enabled = true;
}
}