Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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: }