C# 使用while定期执行任务(true)

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

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