using ibk.IPD.Controller.IPD_PS; using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Remoting.Contexts; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web.Http; using System.Windows.Forms; namespace ibk.IPD.Common { [RoutePrefix("ipd/ipdPs")] [Synchronization()] public class TimerController : ApiController { private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static SurplusMaterialSubstitutionController surplusMaterialSubstitution = new SurplusMaterialSubstitutionController(); /// /// 启动所有余材订单查询匹配的定时器 /// /// [HttpPost, Route("startTimer")] public void Timers() { //创建一个事件来指示超时计数阈值 //定时器回调。 AutoResetEvent autoEvent = new AutoResetEvent(false); //创建需要定时器的类(展示用demo) // StatusChecker statusChecker = new StatusChecker(10); // 创建一个推断的委托,调用计时器的方法。(展示用demo) //TimerCallback tcb = statusChecker.CheckStatus; //创建余材替代推断的委托, 调用需要计时器的方法 TimerCallback tcb = SurplusMaterialSubstitutionController.AddSupersede; // 创建一个指示委托调用的计时器。 logger.Info(string.Format("{0} Creating timer.\n", DateTime.Now.ToString("h:mm:ss.fff"))); System.Threading.Timer stateTimer = new System.Threading.Timer(tcb, autoEvent, 1000, 250); //设置定时器多长时间执行一次(毫秒值) stateTimer.Change(0, 60000); //设置该线程的等待时间 -1 为无限 , 如果为true,则在等待之前退出上下文的同步域(如果处于一个同步的上下文,然后重新获取它 , 相反就是false autoEvent.WaitOne(-1, false); //摧毁定时器(停止) stateTimer.Dispose(); logger.Info("\nDestroying timer : 定时器已销毁, 并停止运行."); } } //展示用demo类 class StatusChecker { private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private int invokeCount; private int maxCount; public StatusChecker(int count) { invokeCount = 0; maxCount = count; } // 此方法由定时器委托调用。 public void CheckStatus(Object stateInfo) { AutoResetEvent autoEvent = (AutoResetEvent)stateInfo; logger.Info(string.Format("{0} Checking status {1,2}.", DateTime.Now.ToString("h:mm:ss.fff"), (++invokeCount).ToString())); } } }