Blocking and waiting for an event

后端 未结 5 1632
不知归路
不知归路 2020-12-15 03:45

It sometimes want to block my thread while waiting for a event to occur.

I usually do it something like this:

private AutoResetEvent _autoResetEvent          


        
5条回答
  •  隐瞒了意图╮
    2020-12-15 04:28

    I modified Dead.Rabit's class EventWaiter to handle EventHandler. So you can use for waiting all events type of EventHandler, that means your delegate is something like delegate void SomeDelegate(object sender, T EventsArgs).

     public class EventWaiter
    {
    
        private AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
        private EventInfo _event = null;
        private object _eventContainer = null;
    
        public EventWaiter(object eventContainer, string eventName)
        {
            _eventContainer = eventContainer;
            _event = eventContainer.GetType().GetEvent(eventName);
        }
    
        public void WaitForEvent(TimeSpan timeout)
        {
            EventHandler eventHandler = new EventHandler((sender, args) => { _autoResetEvent.Set(); });
            _event.AddEventHandler(_eventContainer, eventHandler);
            _autoResetEvent.WaitOne(timeout);
            _event.RemoveEventHandler(_eventContainer, eventHandler);
        }
    }
    

    And for example I use that for waiting to get Url from HttpNotificationChannel when I registering to windows push notification service.

                HttpNotificationChannel pushChannel = new HttpNotificationChannel(channelName);
                //ChannelUriUpdated is event 
                EventWaiter ew = new EventWaiter(pushChannel, "ChannelUriUpdated");
                pushChannel.Open();
                ew.WaitForEvent(TimeSpan.FromSeconds(30));
    

提交回复
热议问题