Мне нужно постоянно опробовать хранилище данных для получения возможных обновлений. Я достигаю этого, используя следующий код. Кстати, это приложение для форм Windows.Выполнение задач с регулярными интервалами с использованием while (true)
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.
Это, кажется, работает отлично, но мне было интересно, есть ли лучший способ его достижения. Кроме того, должна ли моя внешняя задача быть LongRunning?
EDIT:
Хорошо, по предложению Джона и 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);
}
Любые причины, по которым вы не хотите использовать таймер? –
Обновление сообщения с использованием таймера – davenewza
Нет необходимости использовать 'Task.StartNew' внутри прошедшего таймер события; вы уже находитесь в фоновом потоке. Просто выполняйте свою длительную операцию, а затем либо используйте «StartNew» в контексте пользовательского интерфейса, либо «control.Invoke», чтобы вернуться к потоку пользовательского интерфейса. – Servy