public static object Invoke(Func func) { Job j = new Job(func); if(Thread.CurrentThread.GetApartmentState() == ApartmentState.STA) { j.Run(); return j.evaluate(); } else lock(j) { STAHelper helper = STAHelper.Instance; helper.Enqueue(j); Logger.Current.Trace("Job created on STA thread, waiting"); Monitor.Wait(j); Logger.Current.Trace("Job finished on STA thread, returning"); return j.evaluate(); } }
private void Enqueue(Job j) { lock(jobs) { jobs.Enqueue(j); Monitor.PulseAll(jobs); } }