制作轮询线程的最佳方法

时间:2014-07-03 11:15:12

标签: c#

在我的应用程序中,我需要一个后台线程,每隔N秒与服务器联系......

我这样做了:

Task.Factory.StartNew (() => {
            while(true)
            {
                Thread.Sleep (10000);
                ...do my stuff...
            }
        });

此解决方案正常但我需要知道是否有更好的解决方案。 (例如:Task.Delay(10000)是一个更好的解决方案吗?)

非常感谢!

2 个答案:

答案 0 :(得分:2)

如果你需要使用UI,你可以使用DaveDev的例子,否则下面的例子也可以。如果您想在此示例中使用UI,则必须使用控件的InvokeBeginInvoke方法。

using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        // Create a timer that signals the delegate to invoke  
        // CheckStatus after one second, and every 1/4 second  
        // thereafter.
        Timer stateTimer = new Timer(CheckStatus);

        // Change the period to every 1/2 second.
        stateTimer.Change(0, 500);

    }

    public static void CheckStatus(Object stateInfo) {
        ...
    }
}

我认为在这种情况下知道为什么不使用Thread.Sleep很重要。如果你使用sleep,它会锁定线程。如果您使用计时器,那么该线程可用于在此期间执行其他任务。

答案 1 :(得分:0)

        _timer = new DispatcherTimer();
        _timer.Tick += timer_Tick;
        _timer.Interval = new TimeSpan(0, 0, 0, 1);
        _timer.Start();


    private void timer_Tick(object sender, EventArgs e)
    {

        BackgroundWorker backgroundWorker = new BackgroundWorker();
        backgroundWorker.DoWork += (s, a) =>
        {
            //do your stuff
        };

        backgroundWorker.RunWorkerAsync();
    }