我需要不断轮询数据存储以获取可能的更新。我使用以下代码实现了这一目标。顺便说一下,这是一个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选项。但是它仍然在浪费线程。