C# 使用while定期执行任务(true)
我需要不断轮询数据存储以获取可能的更新。我使用以下代码来实现这一点。顺便说一下,这是一个windows窗体应用程序C# 使用while定期执行任务(true),c#,.net,winforms,multithreading,task-parallel-library,C#,.net,Winforms,Multithreading,Task Parallel Library,我需要不断轮询数据存储以获取可能的更新。我使用以下代码来实现这一点。顺便说一下,这是一个windows窗体应用程序 var uiContext = TaskScheduler.FromCurrentSynchronizationContext(); var updateTask = Task.Factory.StartNew(() => { while (true) { Thread.Sleep(5000); Task.Factory.S
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是datagrid控件
这似乎非常有效,但我想知道是否有更好的方法来实现它。另外,我的外部任务是否应该长期运行
编辑:
好的,在Jon和Henk的建议下,我用定时器代替:
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);
}
您可以/应该使用计时器,而不是在池线程中睡觉。
对于WinForms,您只需使用Widows.Forms.Timer
如果您确实想这样做,那么可以使用Longrunning选项。但它仍然在浪费一个线程 您可以/应该使用计时器,而不是在池线程中睡觉。
对于WinForms,您只需使用Widows.Forms.Timer
如果您确实想这样做,那么可以使用Longrunning选项。但它仍然在浪费一个线程 您不想使用某种计时器的任何原因?不需要在计时器已用事件中使用Task.StartNew;你已经在后台线程中。只需正常执行长时间运行的操作,然后在UI上下文中使用StartNew或control.Invoke返回UI线程。哦,这完全有道理-更新帖子。谢谢。另一个“更好的实现方法”是在更新时发出数据存储信号。在“服务器推送”与“客户端拉送”前端,如果数据存储是SQL server,您可以使用任何不想使用某种计时器的原因?不需要在计时器已过事件中使用Task.StartNew;你已经在后台线程中。只需正常执行长时间运行的操作,然后在UI上下文中使用StartNew或control.Invoke返回UI线程。哦,这完全有道理-更新帖子。谢谢。另一个“更好的实现方法”是在更新时发出数据存储信号。在“服务器推送”与“客户端拉送”前端,如果数据存储是SQL server,则可以使用