我需要不断轮询数据存储以获取可能的更新。我使用以下代码实现此目的。顺便说一下,这是一个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);
}
答案 0 :(得分:5)
而不是Sleep()
在PoolThread中你可以/应该使用Timer
对于WinForms,您只需使用Widows.Forms.Timer即可。
如果您确实想这样做,请使用Longrunning选项。但它仍在浪费一个线程。