• 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)
            {
            }
        }
    }
    
    
  • 相关阅读:
    Spring Security 4
    JPA查询
    改进的冒泡算法
    Create User
    COM调用 – VB、PB
    J-Link clone问题
    修复山寨版的J-Link
    C# Web版报表
    HTML/CSS/Javascript代码在线压缩、格式化(美化)工具
    eclipse中字母大小写转换快捷键
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/1900836.html
Copyright © 2020-2023  润新知