国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#函數運行超時則終止執行(任意參數類型及參數個數通用版)

2019-11-17 02:24:59
字體:
來源:轉載
供稿:網友

C#函數運行超時則終止執行(任意參數類型及參數個數通用版)

    /// <summary>    /// 控制函數執行時間,超時返回null不繼續執行    /// 調用方法    /// FuncTimeout.EventNeedRun action = delegate(object[] param)    /// {    ///     //調用自定義函數    ///     return Test(param[0].ToString(), param[1].ToString(), (DateTime)param[2]);    /// };    /// FuncTimeout ft = new FuncTimeout(action, 2000);    /// var result = ft.doAction("1", "2", DateTime.Now);    /// </summary>    public class FuncTimeout    {        /// <summary>         /// 信號量         /// </summary>         public ManualResetEvent manu = new ManualResetEvent(false);        /// <summary>         /// 是否接受到信號         /// </summary>         public bool isGetSignal;        /// <summary>         /// 設置超時時間         /// </summary>         public int timeout;        /// <summary>         /// 定義一個委托 ,輸入參數可選,輸出object        /// </summary>         public delegate object EventNeedRun(params object[] param);        /// <summary>           /// 要調用的方法的一個委托           /// </summary>           PRivate EventNeedRun FunctionNeedRun;        /// <summary>         /// 構造函數,傳入超時的時間以及運行的方法         /// </summary>         /// <param name="_action">運行的方法 </param>         /// <param name="_timeout">超時的時間</param>         public FuncTimeout(EventNeedRun _action, int _timeout)        {            FunctionNeedRun = _action;            timeout = _timeout;        }        /// <summary>         /// 回調函數         /// </summary>         /// <param name="ar"></param>         public void MyAsyncCallback(IAsyncResult ar)        {            //isGetSignal為false,表示異步方法其實已經超出設置的時間,此時不再需要執行回調方法。             if (isGetSignal == false)            {                //放棄執行回調函數;                Thread.CurrentThread.Abort();            }        }        /// <summary>        /// 調用函數         /// </summary>        /// <param name="input">可選個數的輸入參數</param>        /// <returns></returns>        public object doAction(params object[] input)        {            EventNeedRun WhatTodo = CombineActionAndManuset;            //通過BeginInvoke方法,在線程池上異步的執行方法。             var r = WhatTodo.BeginInvoke(input, MyAsyncCallback, null);            //設置阻塞,如果上述的BeginInvoke方法在timeout之前運行完畢,則manu會收到信號。此時isGetSignal為true。             //如果timeout時間內,還未收到信號,即異步方法還未運行完畢,則isGetSignal為false。             isGetSignal = manu.WaitOne(timeout);            if (isGetSignal == true)            {                return WhatTodo.EndInvoke(r);            }            else            {                return null;            }        }        /// <summary>        /// 把要傳進來的方法,和 manu.Set()的方法合并到一個方法體。         /// action方法運行完畢后,設置信號量,以取消阻塞。         /// </summary>        /// <param name="input">輸入參數</param>        /// <returns></returns>        public object CombineActionAndManuset(params object[] input)        {            var output = FunctionNeedRun(input);            manu.Set();            return output;        }    }

  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德江县| 织金县| 芒康县| 平湖市| 烟台市| 高密市| 巩留县| 沙河市| 鲁山县| 陕西省| 榆林市| 东台市| 家居| 屯门区| 赤城县| 上犹县| 吉首市| 汉川市| 珲春市| 武穴市| 古浪县| 仁化县| 中阳县| 英德市| 呼玛县| 惠来县| 靖西县| 杂多县| 喀喇| 贵溪市| 华容县| 炎陵县| 年辖:市辖区| 从江县| 页游| 疏勒县| 武陟县| 晋宁县| 离岛区| 克山县| 诏安县|