2017-10-29 3 views
0

10 초마다 주전산기 코드에 타이머가 설정되었습니다. timer_Elapsed 이벤트에서 참조되는 코드 중 일부는 다소 CPU 사용량이 많기 때문에 await Task.Run(() => 안에 배치했지만 경과 된 이벤트가 실행될 때마다 UI 스레드가 잠깐 멈춰 계속됩니다. 이것이 UI를 막는 이유는 무엇입니까? 코드 :내 비동기 타이머가 UI 스레드를 차단하는 이유는 무엇입니까?

async void _timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     await Task.Run(() => 
     { 
      //Update default status bar text routinely 
      try 
      { 
       if (ChecEnabled()) 
       { 
        this.Dispatcher.Invoke(() => 
        { 
         StatusText.Text = String.Format("Status: Enabled. Watching for changes…"); 
        }); 
       } 
       else 
       { 
        this.Dispatcher.Invoke(() => 
        { 
         StatusText.Text = String.Format("Status: Disabled"); 
        }); 
       } 
      } 
      catch (ObjectDisposedException) 
      { 
       //Window closed and disposed timer on different thread 
      } 

      //System Checks 
      UpdateSystemReadyStatus(); 
     }); 
    } 
+0

'ChecEnabled()'는 CPU를 많이 사용합니까? 이 코드를 게시 할 수 있습니까? 'UpdateSystemReadyStatus'를 보여주는 것도 좋을 것입니다. – Enigmativity

+0

그냥 맑게하십시오 - 문제의 원인이되는 질문에 지금까지 표시된 코드에는 아무것도 없습니다. 우리는 당신에게 좋은 대답을 줄 수 있도록 완전한 코드를 보여줄 필요가 있습니다. – Enigmativity

+0

Timer.Elapsed 핸들러에서 Task를 시작하는 것은 의미가 없습니다. Timer는 이미 백그라운드 스레드에서 실행 중입니다. – Clemens

답변

3

InvokeInvokeAsync으로 업데이트하십시오. 또한 전체 메서드가 실제로 Task에 래핑되어 있어야합니까?

async void _timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    //Update default status bar text routinely 
    try 
    { 
     if (ChecEnabled()) 
     { 
      await this.Dispatcher.InvokeAsync(() => 
      { 
       StatusText.Text = String.Format("Status: Enabled. Watching for changes…"); 
      }); 
     } 
     else 
     { 
      await this.Dispatcher.InvokeAsync(() => 
      { 
       StatusText.Text = String.Format("Status: Disabled"); 
      }); 
     } 
    } 
    catch (ObjectDisposedException) 
    { 
     //Window closed and disposed timer on different thread 
    } 

    //System Checks 
    await Task.Run(()=>UpdateSystemReadyStatus()); 
} 
관련 문제