13,190
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 定时调用指定函数
/// </summary>
public class TimerCall
{
public static TimerCall m_only = new TimerCall();
public static TimerCall Current
{
get { return m_only; }
}
private TimerCall()
{
this.Begin();
}
class CallInfo : IComparable
{
public string Name;
public double Span;
public Action CallBack;
public CallInfo()
{
}
public int CompareTo(object obj)
{
return this.Span.CompareTo((obj as CallInfo).Span);
}
}
public void Clear(string name)
{
if (string.IsNullOrEmpty(name))
return;
lock (toCall)
{
foreach(CallInfo aCI in toCall)
{
if (string.Compare(aCI.Name, name) == 0)
{
toCall.Remove(aCI);
return;
}
}
}
}
List<CallInfo> toCall = new List<CallInfo>();
/// <summary>
/// 注册任务,覆盖同名回调
/// </summary>
/// <param name="name"></param>
public void Regist(string name, double milSecond, Action callback)
{
lock (toCall)
{
Clear(name);
double endT = this.SW.Elapsed.TotalMilliseconds + milSecond;
CallInfo aCI = new CallInfo() { Name=name, Span=endT, CallBack=callback };
toCall.Add(aCI);
}
}
/// <summary>
/// 注册不可取消的回掉
/// </summary>
public void Regist(double milSecond, Action callback)
{
lock (toCall)
{
double endT = this.SW.Elapsed.TotalMilliseconds + milSecond;
CallInfo aCI = new CallInfo() { Name = "", Span = endT, CallBack = callback };
toCall.Add(aCI);
}
}
CallInfo[] getNowAll()
{
lock (toCall)
{
CallInfo[] rT = toCall.ToArray();
toCall.Clear();
return rT;
}
}
public double CreatFunction()
{
return SW.Elapsed.TotalMinutes;
}
System.Diagnostics.Stopwatch SW;
public void Begin()
{
if (SW != null)
{
toCall.Clear();
SW.Stop();
SW = null;
}
SW = new System.Diagnostics.Stopwatch();
SW.Start();
Action doThread = new Action(DoTimer);
doThread.BeginInvoke(null, null);
}
public void Stop()
{
this.SW = new System.Diagnostics.Stopwatch();
}
void DoTimer()
{
System.Diagnostics.Stopwatch bindding = this.SW;
while (bindding == this.SW)
{
try
{
CallInfo[] toDO = getNowAll();
if (toDO.Length == 0)
{
System.Threading.Thread.Sleep(600);
continue;
}
double nowTime = bindding.Elapsed.TotalMilliseconds;
for (int i = 0; i < toDO.Length; i++)
{
CallInfo tmp = toDO[i];
if (tmp.Span <= nowTime)
{
try
{
tmp.CallBack();
}
catch (Exception ed)
{
ErrorLog.Current.LogException(100, "定时器调度", ed);
}
}
else
{
lock (toCall)
{
toCall.Add(tmp);
}
}
}
System.Threading.Thread.Sleep(200);
}
catch (Exception eh)
{
ErrorLog.Current.LogException(100, "timercall loop", eh);
}
}
}
}