2012-10-19 1 views
1

가능한 업데이트를 위해 지속적으로 데이터 저장소를 폴링해야합니다. 다음 코드를 사용하여이 작업을 수행하고 있습니다. 이것은 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); 
} 
+4

어떤 종류의 '타이머'를 사용하고 싶지 않은 이유는 무엇입니까? –

+0

타이머를 사용하여 업데이트 된 게시물 – davenewza

+2

타이머 경과 이벤트 내에 'Task.StartNew'를 사용할 필요가 없습니다. 이미 백그라운드 스레드에 있습니다. 오랫동안 정상적으로 실행되는 작업을 수행 한 다음 UI 컨텍스트에서'StartNew'를 사용하거나'control.Invoke'를 사용하여 UI 스레드로 돌아가십시오. – Servy

답변

5

대신 Sleep() PoolThread에 넣으면 타이머를 사용할 수 있습니다.
WinForms의 경우 Widows.Forms.Timer를 사용하면됩니다.

이렇게하려면 예를 들어, Longrunning 옵션을 사용하십시오. 하지만 여전히 스레드를 낭비하고 있습니다.

+0

타이머를 사용하여 소식이 업데이트되었습니다. – davenewza

관련 문제