Udostępnij za pośrednictwem


CCR tips and tricks - part 16

The pattern used in part 15 can be implemented as a helper method that looks like this:

   1: public static void ExecuteUsingClrThreadPool(Action handler)
  2: {
  3:     if (handler == null)
  4:     {
  5:         throw new ArgumentNullException("handler");
  6:     }
  7:  
  8:     if (Thread.CurrentThread.IsThreadPoolThread)
  9:     {
 10:         handler();
 11:     }
 12:     else
 13:     {
 14:         using (var dispatcherQueueUsingClrThreadPool = new DispatcherQueue())
 15:         {
 16:             Arbiter.ExecuteToCompletion(
 17:                 dispatcherQueueUsingClrThreadPool, 
 18:                 Arbiter.FromHandler(() => handler()));
 19:         }
 20:     }
 21: }

Using that helper the method from part 15 can be implemented like this:

  22: private IEnumerator<ITask> MethodThatNeedToCallBlockingMethodFromCcr(
 23:     DispatcherQueue taskQueue,
 24:     Port<EmptyValue> donePort)
 25: {
 26:     yield return
 27:         Arbiter.ExecuteToCompletion(
 28:             taskQueue, 
 29:             Arbiter.FromHandler(
 30:                 () => ExecuteUsingClrThreadPool(
 31:                     () => this.BlockingMethod(42))));
 32:     donePort.Post(EmptyValue.SharedInstance);
 33: }