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(Func 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;
}
}
}