1

我需要不断地轮询数据存储以获取可能的更新。我正在使用以下代码实现这一点。顺便说一下,这是一个 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);
}
4

1 回答 1

5

您可以/应该使用 Timer,而不是Sleep()在 PoolThread 中使用。
对于 WinForms,您可以简单地使用 Widows.Forms.Timer。

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

于 2012-10-19T13:16:18.867 回答