public BindInfo(Delegate clientHandler, EventHandlerShim shim, long handlerId) { ClientHandler = clientHandler; Shim = shim; HandlerId = handlerId; _eventHandlerInvoker = GetEventHandlerInvoker(ClientHandler.GetType(), ClientHandler.Method.GetParameters()); }
void AddEventTarget(Type sourceType, object source, string eventName, Delegate handler, WeakBridgeDuplicateMode?duplicateMode) { if ((sourceType == null) == (source == null)) { throw new ArgumentException("Exactly one of sourceType and source must be non-null"); } if (eventName == null) { throw new ArgumentNullException("eventName"); } if (handler == null) { throw new ArgumentNullException("handler"); } EventHandlerShim shim; lock (_bindInfosLock) { var match = GetBindInfoMatcher(sourceType, source, eventName, handler); if ((duplicateMode ?? _defaultDuplicateMode) == WeakBridgeDuplicateMode.CheckAndPrevent && _bindInfos.Where(x => x != null).Any(match)) { // already bound return; } // find unused index var handlerIndex = Array.IndexOf(_bindInfos, null); if (handlerIndex == -1) { // no unused: expand array handlerIndex = _bindInfos.Length; Array.Resize(ref _bindInfos, _bindInfos.Length + _growBindInfosBy); } // may throw ArgumentException var handlerId = _nextBindInfoId++; shim = new EventHandlerShim(sourceType, source, eventName, _thisReference, handlerIndex, handlerId, handler.Method.GetParameters()); _bindInfos[handlerIndex] = new BindInfo(handler, shim, handlerId); // DEADLOCK (uncomment the next line, and comment out the same call just below) // shim.RegisterEventHandler(); } // Don't register the event handler in the synchronization context to avoid the possibility of // deadlocks triggered by side-effects of binding (e.g. further bind/unbind activity via an // add accessor in the event source class) shim.RegisterEventHandler(); if (_unregisterInFinalizer) { GC.ReRegisterForFinalize(this); } }
public async Task HandlingCommandWithNoRegisteredHandlerShouldRunNoMatchingRegistrationHandler() { var busSettings = new BusSettings(); var updater = new OuterPipelineDetector(); var dependencyScope = new TestDependencyScope(); var handler = new TestEventHandler(); var handlerShim = new EventHandlerShim <NoMatchingRegistrationEvent, TestEventHandler>(handler); dependencyScope.AddObject(handlerShim); var busBuilder = new BusBuilder() .RegisterEventHandler <NoMatchingRegistrationEvent, TestEventHandler>(); var pipelineBuilder = new PipelineBuilder(busBuilder); var pipelineRunBuilder = new PipelineRunBuilder(busSettings, pipelineBuilder, updater, dependencyScope); var runner = pipelineRunBuilder.GetRunnerForPipeline(typeof(TestCommand), default(CancellationToken)); await runner.Handle(new TestCommand()); handler.CallsToHandle.Should().Be(1); }