using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RichCreator { /// /// 函数调用帮助单元 /// public class FuncUtils { /// /// 支持取消和超时的函数包装 /// /// /// 原函数传出值 /// 超时毫秒 /// 取消Token /// 原函数 /// 每次尝试中间间隔毫秒数 /// public static bool TimeoutCancelableWrap(out T val, Int32 timeoutMillSecond, CancellationToken cancelToken, Func> method, Int32 proidTime = 1000) { val = default(T); DateTime expireTimeout = DateTime.Now.AddMilliseconds(timeoutMillSecond); TimeoutCancelCallResult result; G.Instance.RemainTimeWriter(timeoutMillSecond / 1000); while (!cancelToken.IsCancellationRequested) { if (DateTime.Now > expireTimeout) { G.Instance.RemainTimeWriter(-1); return false; } result = method(); if (result.Result) { G.Instance.RemainTimeWriter(-1); val = result.ReturnVal; return true; } Thread.Sleep(proidTime); G.Instance.RemainTimeWriter((Int32)(expireTimeout - DateTime.Now).TotalSeconds); } G.Instance.RemainTimeWriter(-1); return false; } /// /// 支持取消和超时的函数包装 /// /// /// 原函数传出值 /// 超时毫秒 /// 取消Token /// 原函数 /// 每次尝试中间间隔毫秒数 /// public static bool TimeoutCancelableWrap(Int32 timeoutMillSecond, CancellationToken cancelToken, Func method, Int32 proidTime = 1000) { bool result = false; DateTime expireTimeout = DateTime.Now.AddMilliseconds(timeoutMillSecond); G.Instance.RemainTimeWriter(timeoutMillSecond / 1000); while (!cancelToken.IsCancellationRequested) { if (DateTime.Now > expireTimeout) { G.Instance.RemainTimeWriter(-1); return false; } result = method(); if (result) { G.Instance.RemainTimeWriter(-1); return true; } Thread.Sleep(proidTime); G.Instance.RemainTimeWriter((Int32)(expireTimeout-DateTime.Now).TotalSeconds); } G.Instance.RemainTimeWriter(-1); return false; } /// /// 没有变化重试的调用包装 /// /// 主要工作方法 /// 检测前面的工作方法是否按预定成功了的方法 /// 检测方法超时毫秒数 /// 检测是否还处于之前没调用工作方法的阶段 /// 重试次数 /// 取消句柄 /// public static bool NoChangeRetryCallWrap(Action workFun, Func workFinishedDectedFun, Func preDectedFun,Int32 tryCount=3) { Int32 tryCounter = 0; while (tryCounter /// 超时取消回调返回值 /// /// public struct TimeoutCancelCallResult { public TimeoutCancelCallResult(bool result, T returnVal) { this.Result = result; this.ReturnVal = returnVal; } public bool Result; public T ReturnVal; } } }