Well the form is pausing because this code
while (!o.JobFinished)
{
// Do something (update status, etc.)
}
is forcing it to wait, even though the actual dll code is running on another thread.
You need to let the method finish. (Or I suppose you could use Application.DoEvents()
if it doesn't leave a bad taste in your mouth.
To get the status information you should use an event that you can hook up after creating the dll. That way your app can be notified when the dll changes it's status.
Alternatively you could use a second timer and poll each running job for it's status, but events would be better.