使用while(true)定期执行任务

时间:2012-10-19 13:13:25

标签: c# .net winforms multithreading task-parallel-library

我需要不断轮询数据存储以获取可能的更新。我使用以下代码实现此目的。顺便说一下,这是一个Windows窗体应用程序。

var uiContext = TaskScheduler.FromCurrentSynchronizationContext();

var updateTask = Task.Factory.StartNew(() =>
{
    while (true)
    {
        Thread.Sleep(5000);

        Task.Factory.StartNew(() =>
        {
            someData = dataStore.GetData();
        }).ContinueWith(t =>
        {
            someGrid.DataSource = someData;
        }, uiContext);
    }
});

someData是私有类字段,someGrid是数据网格控件。

这似乎完美无缺,但我想知道是否有更好的方法来实现它。另外,我的外部任务应该是LongRunning吗?

修改

好的,根据Jon和Henk的建议,我正在使用Timer:

uiContext = TaskScheduler.FromCurrentSynchronizationContext();

updateTimer = new System.Timers.Timer(5000);
updateTimer.Elapsed += updateTimer_Elapsed;
updateTimer.Enabled = true;

已逝去的事件:

void updateTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    someData = dataStore.GetData();

    Task.Factory.StartNew(() =>
    {
        someGrid.DataSource = someData;
    }, uiContext);
}

1 个答案:

答案 0 :(得分:5)

而不是Sleep()在PoolThread中你可以/应该使用Timer 对于WinForms,您只需使用Widows.Forms.Timer即可。

如果您确实想这样做,请使用Longrunning选项。但它仍在浪费一个线程。

相关问题