Я прочитал пост на форуме Microsoft CCR о сокращении накладных расходов на вызовы Port.Post () [ref .: PortElement Instantiation в CCR ], и мне было интересно, есть ли подобное способ связать порт с его получателем, чтобы использовать порт в режиме OptimizedSingleReissueReceiver в арбитре чередования?
Я реализовал следующий код, использующий этот PortMode для чередования:
// Creates the Receiver
Receiver receiver = Arbiter.Receive(true, inputPort, inputPortHandler);
// Change the port mode before binding the Receiver with the DispatcherQueue
inputPort.Mode = PortMode.OptimizedSingleReissueReceiver;
// Creates the Interleave
ExclusiveReceiverGroup exclusiveReceiverGroup = new ExclusiveReceiverGroup(receiver);
Interleave interleave = Arbiter.Interleave(new TeardownReceiverGroup(),
exclusiveReceiverGroup,
new ConcurrentReceiverGroup());
// Activate the Interleave
Arbiter.Activate(dispatcherQueue, interleave);
Сначала это выглядело нормально, однако время от времени я по-прежнему получал исключение NullReferenceException (это исключение указывает, что порт еще не связан с получателем).
Кто-нибудь знает другой способ использования PortMode.OptimizedSingleReissueReceiver внутри Interleave?