Wake WaitHandle AsycProcessor AutoResetEvent


namespace Microshaoft
{
    using System;
    using System.Threading;
    public class WakeProcessor<TData>
    {
        private delegate void ProcessCaller(AutoResetEvent wait, TData data);
        public delegate void WaitEventHandler(WakeProcessor<TData> sender, TData data);
        public event WaitEventHandler OnWaitOneTimeout;
        public event WaitEventHandler OnWaitOneWake;
        public event WaitEventHandler OnWaitComplete;
        private int _waitOneTimeoutSeconds = 0;
        private int _waitTimeoutMinutes = 0;
        public WakeProcessor
                        (
                            AutoResetEvent waitHandle
                            , int waitOneTimeoutSeconds
                            , int waitTimeoutMinutes
                            , TData data
                        )
        {
            BeginWaiting
                    (
                        waitHandle
                        , waitOneTimeoutSeconds
                        , waitTimeoutMinutes
                        , data
                    );
        }
        public void BeginWaiting
                            (
                                AutoResetEvent waitHandle
                                , int waitOneTimeoutSeconds
                                , int waitTimeoutMinutes
                                , TData data
                            )
        {
            _waitOneTimeoutSeconds = waitOneTimeoutSeconds;
            _waitTimeoutMinutes = waitTimeoutMinutes;
            ProcessCaller handler = new ProcessCaller(Process);
            //AsyncCallback callback = new AsyncCallback(ProcessedCallback);
            //IAsyncResult result =
            handler.BeginInvoke(waitHandle, data , null, null);
        }
        private void Process(AutoResetEvent wait, TData data)
        {
            DateTime beginTime = DateTime.Now;
            while (DateTime.Now.Subtract(beginTime).TotalSeconds <= _waitTimeoutMinutes * 60)
            {
                bool r = wait.WaitOne(_waitOneTimeoutSeconds * 1000);
                if (r)
                {
                    if (OnWaitOneWake != null)
                    {
                        OnWaitOneWake(this, data);
                    }
                }
                else
                {
                    if (OnWaitOneTimeout != null)
                    {
                        OnWaitOneTimeout(this, data);
                    }
                }
                //if (r)
                //{
                //    break;
                //}
            }
            //if (!r)
            {
                if (OnWaitComplete != null)
                {
                    OnWaitComplete(this, data);
                }
            }
        }
        private void ProcessedCallback(IAsyncResult result)
        {
        }
    }
}

原文地址:https://www.cnblogs.com/Microshaoft/p/1900836.html