Is the whole OS locked up while the external program runs or is it just your app?
If it is the whole OS then you need to look at what that program is doing.
If it is just your app then try allowing your app to continue by handling the Process.Exited event in your code.
private void modem1_start()
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = true; // <-- allow events to execute
proc.StartInfo.FileName = @"FILENAME.exe";
// capture process finished
proc.Exited += new EventHandler(proc_Exited);
//proc.WaitForExit(); // <-- do not wait
void proc_Exited(object sender, EventArgs e)
//Do post process things here
You will probably need to declare the process variable proc outside the thread method.
(Otherwise Garbage Collection might get rid of it before the process finishes)