2014-04-17 3 views
1

스레드를 시작하고 양식 요소를 업데이트하지만 코드가 다음과 같이 양식을 작성하지 못하는 경우 여기에서 잘못된 것을 제안하십시오.winform 양식이 응답하지 않게 됨

private void StartTimer() 
    { 
     Thread t = new Thread(Updates); 
     t.IsBackground = true; 
     t.Start(); 
    } 

    private void Updates() 
    { 
     try 
     { 

      while (true) 
      { 

       this.Invoke((MethodInvoker)delegate 
        { 
         lblTotalImages.Text = AppHelper.GetTotalCount(textBox1.Text).ToString(); 
         if (sitename != null) 
         { 

          lblTotalPosted.Text = AppHelper.GetPostedCount(sitename).ToString(); 
          // Application.DoEvents(); 

         } 
        }); 
       Thread.Sleep(1000); 

      } 

     } 
     catch (Exception ex) 
     { 
     } 
    } 

편집 ------- 작업 병렬 라이브러리를 도입 감사 @Servy 내가 그것을 여기에 내가 타이머와 작업 공장을 사용 내가 생각해 솔루션을 사용한 적이 나중에 .NET 4 라이브러리없이 확장 2010 대 난이 당신이이 UI 스레드에서 수행되는 것을 의미합니다 Invoke에 대한 호출의 내부 장기 실행 비 UI 작업의 일종을하고있는

enter code here private void timer1_Tick(object sender, EventArgs e) 
    { 

     Task.Factory.StartNew(() => AppHelper.GetTotalCount(textBox1.Text)).ContinueWith(t => lblTotalImages.Text = t.Result.ToString(), TaskScheduler.FromCurrentSynchronizationContext()); 

     if (sitename != null) 
     { 
      Task.Factory.StartNew(() => AppHelper.GetPostedCount(sitename)).ContinueWith(t => lblTotalPosted.Text = t.Result.ToString(), TaskScheduler.FromCurrentSynchronizationContext()); 



     } 



    } 
+1

포스트'AppHelper.GetTotalCount'와'AppHelper.GetTotalCount' 코드를. –

+0

안녕 Sriram 덕분에 아직 구현하지 않은 두 함수 반환 1; – user3546002

+1

'while (true)'와'Thread.Sleep'은 꽤 나쁜 조합이지만 그때도 당신의 호출은 당신의 메인 프로그램의 스레드를 끊임없이 그냥 약간의 텍스트를 업데이트하는 것입니다. – Sayse

답변

2

완벽하게 작동했다. UI 스레드에서만 UI를 업데이트하려고 노력해야합니다. 장기간 실행중인 비 UI 코드가 UI 스레드에 대한 호출 외부에 있는지 확인하십시오.

await의 사용은이 솔루션이 훨씬 간단하고 효과적인 영지로 작성 할 수 있습니다 :

public async void StartTimer() 
{ 
    while (true) 
    { 
     string text = textBox1.Text; 
     lblTotalImages.Text = await Task.Run(() => 
      AppHelper.GetTotalCount(text).ToString()); 
     if (sitename != null) 
     { 
      lblTotalPosted.Text = await Task.Run(() => 
       AppHelper.GetPostedCount(sitename).ToString()); 
     } 
     await Task.Delay(TimeSpan.FromSeconds(1)); 
    } 
} 
+0

wao thats는 정말 도움이되기 전에 결코 사용하지 않은 작업입니다. 내가 인터넷 검색을 수행하고 작업 병렬 라이브러리에 대한 자세한 정보를 얻을 스레드 대신 스레드 마법의 libray 덜 코드에 대한 의견을 주셔서 감사합니다 소개 Servy – user3546002

+0

내가 가지고있다. 4.0을 컴파일 할 수 없습니다 에 대한 .net 프레임 워크 4.0 여기 Savy 솔루션을 사용하는 방법입니다 http://blogs.msdn.com/b/bclteam/archive/2012/10/22/using-async-await-without-net-framework-4-5.aspx – user3546002

+0

@ user3546002 C# 5.0이 필요합니다. 라이브러리 확장을 사용하여 .NET 4.0으로 컴파일 할 수 있지만 VS 2012가 있어야합니다. – Servy

관련 문제