Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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: }