栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Windows服务中使用的最佳计时器

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Windows服务中使用的最佳计时器

双方

System.Timers.Timer
System.Threading.Timer
会为服务工作。

您要避免使用的计时器是

System.Web.UI.Timer
System.Windows.Forms.Timer
,分别用于ASP应用程序和WinForms。使用这些组件将使服务加载额外的程序集,而这对于您正在构建的应用程序类型并不是真正需要的。

使用

System.Timers.Timer
类似下面的示例(此外,请确保使用类级别的变量来防止垃圾收集,如Tim
Robinson的回答所述):

using System;using System.Timers;public class Timer1{    private static System.Timers.Timer aTimer;    public static void Main()    {        // Normally, the timer is declared at the class level,        // so that it stays in scope as long as it is needed.        // If the timer is declared in a long-running method,          // KeepAlive must be used to prevent the JIT compiler         // from allowing aggressive garbage collection to occur         // before the method ends. (See end of method.)        //System.Timers.Timer aTimer;        // Create a timer with a ten second interval.        aTimer = new System.Timers.Timer(10000);        // Hook up the Elapsed event for the timer.        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);        // Set the Interval to 2 seconds (2000 milliseconds).        aTimer.Interval = 2000;        aTimer.Enabled = true;        Console.WriteLine("Press the Enter key to exit the program.");        Console.ReadLine();        // If the timer is declared in a long-running method, use        // KeepAlive to prevent garbage collection from occurring        // before the method ends.        //GC.KeepAlive(aTimer);    }    // Specify what you want to happen when the Elapsed event is     // raised.    private static void onTimedEvent(object source, ElapsedEventArgs e)    {        Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);    }}

如果选择

System.Threading.Timer
,则可以使用以下方法:

using System;using System.Threading;class TimerExample{    static void Main()    {        AutoResetEvent autoEvent     = new AutoResetEvent(false);        StatusChecker  statusChecker = new StatusChecker(10);        // Create the delegate that invokes methods for the timer.        TimerCallback timerDelegate =  new TimerCallback(statusChecker.CheckStatus);        // Create a timer that signals the delegate to invoke         // CheckStatus after one second, and every 1/4 second         // thereafter.        Console.WriteLine("{0} Creating timer.n",  DateTime.Now.ToString("h:mm:ss.fff"));        Timer stateTimer =      new Timer(timerDelegate, autoEvent, 1000, 250);        // When autoEvent signals, change the period to every         // 1/2 second.        autoEvent.WaitOne(5000, false);        stateTimer.Change(0, 500);        Console.WriteLine("nChanging period.n");        // When autoEvent signals the second time, dispose of         // the timer.        autoEvent.WaitOne(5000, false);        stateTimer.Dispose();        Console.WriteLine("nDestroying timer.");    }}class StatusChecker{    int invokeCount, maxCount;    public StatusChecker(int count)    {        invokeCount  = 0;        maxCount = count;    }    // This method is called by the timer delegate.    public void CheckStatus(Object stateInfo)    {        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;        Console.WriteLine("{0} Checking status {1,2}.",  DateTime.Now.ToString("h:mm:ss.fff"),  (++invokeCount).ToString());        if(invokeCount == maxCount)        { // Reset the counter and signal Main. invokeCount  = 0; autoEvent.Set();        }    }}

这两个示例均来自MSDN页面。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/597020.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号