2014-06-20 2 views
0

다양한 테스트 결과를 생성하는 Windows 응용 프로그램에서 작업 중입니다. UI는 이벤트 핸들러로서 다양한 방법을 갖는 Results 버튼을 제공한다. 이 메소드는 API 모듈에 의해 제공됩니다. 모듈은웨어 하우스에서 데이터를 가져 와서 사용자에게 표시합니다. API 호출이 비동기입니다.Dispatcher를 사용하여 Wpf Ui를 차단 해제

하지만 버튼을 클릭하면 UI가 차단됩니다. Dispatcher는 백그라운드에서 프로세스를 실행하는 데 도움이된다는 것을 알게되었습니다. Dispatcher는 UI 스레드에 의해서만 호출되거나 호출 될 수 있습니다. UI를 차단하지 않도록 디스패처를 구현하려면 어떻게해야합니까?

C#에서 기능이

private async void get_results(object sender, RoutedEventArgs e) 
{ 
     List<resultsummary> data = new List<resultsummary>(); 
     if(id==plan_id) 
     { 
      data= await getdata.getsummary(id, name); 
     }   
} 

편집과 같은 : -

이 비동기에 대한 이해이며, 위의 코드에서 기다리고 있습니다. 그러나 오류 cannot await을 제공합니다. getdata 클래스는 differnet 네임 스페이스에 있으며 getsummary 메서드가 해당 공간에 정의되어 있습니다.

주된 목적은 UI를 차단 해제하고 Dispatcher 기술을 사용하여이 문제를 해결하는 것입니다.

+0

+1 @ HighCore. 다시 ... 너의 일을 사랑해. – Sheridan

답변

0

당신은 Action을 사용할 수 있습니다 ...

이 "

Action action =() => 
{ 
    // your code... 
}; 

같은 Action에 코드를 넣어 당신이 결과를

myLabel.Dispatcher.BeginInvoke(action); 
1

당신은 돈 '을 표시하는 라벨이 있다고 가정 배경 스레드에서 데이터를 가져 와서 해당 데이터를 백그라운드 스레드에서 UI 스레드로 전달하려면 다음을 수행 할 수 있습니다. Task class을 사용하십시오.

Task.Factory.StartNew((Func<YourDataType>)delegate() 
{ 
    // Fetch data on background thread here (return YourDataType, whatever that is) 
    return DataAccessClass.GetData(); 
}).ContinueWith((Task<YourDataType> task) => 
{ 
    // Update controls with result on UI thread here 
    YourUiProperty = task.Result; 
}, TaskScheduler.FromCurrentSynchronizationContext()); 

물론, 당신은 당신의 데이터 형식이 무엇이든 함께 YourDataType 유형을 교체해야합니다.

+1

+1. C# 5의 'async/await' 기능을 사용하면이 코드가 훨씬 더 우아하고 아름답다고 언급 할 가치가 있습니다. –

+0

그래, 모두가. NET 4.5를 아직 사용하지 않는다는 것을 알았다. ... 음 ... 나는 노년기에 게으르다 고 생각한다. 그리고 그것은 * 자정이다. 하지만 그래, 유효 지점, 잘 언급했다. – Sheridan

관련 문제