code: def _CallEventHandler(self, Event, *Args, **KwArgs):
          
          if Event not in self._EventHandlers:
              raise ValueError('%s is not a valid %s event name' % (Event, self.__class__.__name__))
          args = map(repr, Args) + ['%s=%s' % (key, repr(value)) for key, value in KwArgs.items()]
          self.__Logger.debug('calling %s: %s', Event, ', '.join(args))
          # Get a list of handlers for this event.
          try:
              handlers = [self._DefaultEventHandlers[Event]]
          except KeyError:
              handlers = []
          try:
              handlers.append(getattr(self._EventHandlerObject, Event))
          except AttributeError:
              pass
          handlers.extend(self._EventHandlers[Event])
          # Proceed only if there are handlers.
          if handlers:
              # Get the last thread for this event.
              after = self._EventThreads.get(Event, None)
              # Create a new thread, pass the last one to it so it can wait until it is finished.
              thread = EventSchedulerThread(Event, after, handlers, Args, KwArgs)
              # Store a weak reference to the new thread for this event.
              self._EventThreads[Event] = thread
              # Start the thread.
              thread.start()
docs: Calls all event handlers defined for given Event, additional parameters
          will be passed unchanged to event handlers, all event handlers are fired on
          separate threads.
          
          :Parameters:
            Event : str
              Name of the event.
            Args
              Positional arguments for the event handlers.
            KwArgs
              Keyword arguments for the event handlers.