가능한 업데이트를 위해 지속적으로 데이터 저장소를 폴링해야합니다. 다음 코드를 사용하여이 작업을 수행하고 있습니다. 이것은 Windows Forms 응용 프로그램입니다.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
는 데이터 그리드 컨트롤입니다.
이것은 완벽하게 작동하는 것처럼 보이지만이를 달성하는 더 좋은 방법이 있는지 궁금합니다. 또한, 내 외부 작업 LongRunning해야합니까?
편집 :
좋아, 존과 헹크의 제안에, 내가 대신 타이머를 사용하고 있습니다 :
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'를 사용할 필요가 없습니다. 이미 백그라운드 스레드에 있습니다. 오랫동안 정상적으로 실행되는 작업을 수행 한 다음 UI 컨텍스트에서'StartNew'를 사용하거나'control.Invoke'를 사용하여 UI 스레드로 돌아가십시오. – Servy