C# 函数超时处理

做串口测试的时候,发现断开硬件连接后发送数据一直无回应,故用此方法,等待指定的时间后做一些动作。

记录下,以后用的上。
        public static bool isTimeOut(LS6827B_USB_CDC.TimeOutDelegate method,byte[] data) {
            IAsyncResult rst= method.BeginInvoke(data,null,null);
            if (rst.AsyncWaitHandle.WaitOne(new TimeSpan(0, 0, 1))) {
                method.EndInvoke(rst);
                return true;
            }
            else
            {
                return false;
            }
        }

.net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的ThreadID [DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)] public static extern Int32 GetCurrentWin32ThreadID(); #endregion #region 登记访问任务子线程 /// <summary> /// 访问任务子线程 /// </summary> public static Hashtable TaskThreadIDTable = Hashtable.Synchronized(new Hashtable()); private static int[] TaskThreadIDs { get { int[] IDs = new int[TaskThreadIDTable.Keys.Count]; TaskThreadIDTable.Keys.CopyTo(IDs, 0); return IDs; } } public static void RegisterThread(int _threadid, System.Threading.Thread thread) { if (!TaskThreadIDTable.ContainsKey(_threadid)) TaskThreadIDTable.Add(_threadid, thread); if (!ExitInvalidThreadLoopRunning) { Thread ExitInvalidThreadLoopThread = new Thread(new ThreadStart(ExitInvalidThreadLoop)); ExitInvalidThreadLoopThread.Priority = ThreadPriority.AboveNormal; ExitInvalidThreadLoopThread.Start(); } } #endregion #region 关闭,退出超时的用户线程 private static DateTime ExitInvalidThreadLoop_LastRunTime = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0, 0)); private static bool ExitInvalidThreadLoopRunning { get { return DateTime.Now.Subtract(ExitInvalidThreadLoop_LastRunTime).TotalMinutes < 10; } } private static void ExitInvalidThreadLoop() { while (true) { ExitInvalidThread(); ExitInvalidThreadLoop_LastRunTime = DateTime.Now; //每10秒检查一次 Thread.Sleep(10 * 1000); }
相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页