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(); } }
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 Run() { while (true) { Job current = null; lock (jobs) { if (jobs.Count == 0) { Monitor.Wait(jobs); continue; } else { current = jobs.Dequeue(); } } current.Run(); lock (current) { Monitor.PulseAll(current); } } }