2014-07-09 4 views
0

Windows Form에서 결과를 레이블에서 자동으로 새로 고치고 싶습니다. 이 코드는 작동하지만 레이블의 텍스트는 변경되지 않습니다. 제 견해로 프로그램은 레이블을 새로 고치기 위해 작업을 중단해야합니다. http://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed.aspxhttp://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k(EHInvalidOperation.WinForms.IllegalCrossThreadCall);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true, 도 시도했지만 작동하지 않습니다. 그것은 스레드가 다르다 고 그들은 그것을 할 수 없다. 또한 MSNDa 코드 :(나를 위해 작동하지 않습니다while (true) 루프에서 결과를 레이블에 표시하는 방법

private void button1_Click(object sender, EventArgs e) 
    { 
     while (true) 
     { 
      CaluclateTime(); 
      Thread.Sleep(1000); 
     } 
    } 

    private void CaluclateTime() 
    { 
     DateTime zeroDateTime = new DateTime(2014, 9, 16, 15, 00, 0); 
     //zeroDateTime is a future :). 
     DateTime now = DateTime.Now; 
     TimeSpan duration = zeroDateTime - now; 
     label1.Text = String.Format("Time zero is in: {0}", duration.ToString()); 
    } 
+0

당신이 만약 'System.Timers.Timer' 타이머를 사용하고, s를 만듭니다. 'SynchronizingObject' 속성을 설정했는지 확인하십시오. 예제는 [이 답변] (http://stackoverflow.com/a/24086028)을 참조하십시오. 그것 없이는 CrossThreadExceptions를 던질 것이다. –

답변

1

을 당신은 async/await 기능을 이용할 수 있습니다.이처럼 CalculateTime 방법을

private async void button1_Click(object sender, EventArgs e) 
{ 
    while (true) 
    { 
     CaluclateTime(); 
     await Task.Delay(1000); 
    } 
} 

을 변경 : 또한

if (this.InvokeRequired) 
    this.Invoke(() => label1.Text = String.Format("Time zero is in: {0}", duration.ToString())); 
else 
    label1.Text = String.Format("Time zero is in: {0}", duration.ToString()); 

루프를 중지하는 것을 잊지 마십시오.

2

(관련성) Force GUI update from UI Thread

편집 : 백그라운드 스레드에 보내고하지만 당신은 하나의 스레드에서 그 일을 주장하는 경우, 당신은이 대답을 읽어야Application.DoEvents() 호출 윈도우는 어떤 뛰어난 UI 이벤트를 처리하기 위해 UI 양식의 원인, 레이블 텍스트 업데이트와 같은 Windows Control 업데이트가 포함됩니다. label Text property의 갱신 직후에이 Methods를 호출합니다.

전체적인 개선을 위해 편집 : 백그라운드 스레드에서 실행중인 프로세스를 오래 실행하면 장시간 실행되는 작업이 수행되는 동안 사용자가 다른 작업 (원하는 경우)을 수행하게 할 수 있습니다. 사용자에게 바람직한 UI가 항상 반응하므로 사용자를위한보다 나은 사용자 경험을 제공합니다. C#에서

배경 스레드 기술은 다음과 같습니다

+0

해당 링크의 관련 부분을 답변에 추가 할 수 있습니까? 링크 된 답변은 여기에서 눈살을 찌푸리게됩니다. 링크 된 페이지가 변경되거나 제거되면 쓸모 없게되는 경향이 있기 때문입니다. –

+0

관련 코드 호출이 추가되었습니다. – toadflakz

+0

좋아요! 당신이 그 방법을 사용하는 방법에 대한 예제를 추가 할 수 있다면 당신의 대답은 더욱 향상 될 수 있습니다. 또한 배경 스레드에서 처리를 제안하는 이유에 대한 정교함을 제공 할 수 있습니다. 도움이!). –

관련 문제