我需要不断轮询数据存储以获取可能的更新。我使用以下代码实现了这一目标。顺便说一下,这是一个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是一个私有(private)类字段,而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);
}

最佳答案

可以/应该使用Timer来代替PoolThread中的Sleep()编码。
对于WinForms,您可以简单地使用Widows.Forms.Timer。

如果您确实想这样做,则可以,使用Longrunning选项。但是它仍然在浪费线程。

09-25 18:25