2012-02-01 3 views
0

C#으로 작성된 WPF 응용 프로그램이 있습니다. 내가 작성한 WCF 서비스를 호출합니다. 때때로 WCF 서비스는 데이터를 새로 고쳐야하는지 여부에 따라 반환까지 최대 20 초가 걸릴 수 있습니다. WCF 서비스를 비동기 호출을 지원하도록 만들 수 있지만 WCF 서비스 호출을 새 스레드로 래핑하는 것이 효과적이라고 생각하는 또 다른 솔루션입니다. 나는 다음 코드로 그렇게했다.스레드가 비동기식으로 작동하지 않습니다.

new System.Threading.Thread(
    new System.Threading.ThreadStart(
    delegate() 
    { 
     Action del = delegate() 
     { 
      MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
      lblTotalCost.Text = ms.GetTotalCost().ToString("C"); 
     }; 

     this.Dispatcher.BeginInvoke(del); 
    })).Start(); 

InitializeComponent()를 실행 한 후, 이것을 내 UserControls 중 하나의 생성자 함수에 넣었다.

서비스 호출이 없으면 응용 프로그램이 서비스 호출이 완료 될 때까지 나타나지 않습니다. 이 기능을 추가하면 응용 프로그램이 즉시 나타나고 서비스 호출이 완료되면 레이블이 채워지 길 바랄 것입니다. 놀랍게도, 이것은 일어나지 않았습니다. 응용 프로그램은 서비스 호출이 완료 될 때까지 나타나지 않습니다.

내가 의도 한대로 수정하려면 어떻게해야합니까?

감사합니다.

답변

3

Dispatcher을 사용하면 모두을 UI 스레드에 다시 적용합니다. lblTotalCost.Text에 대한 할당 만해야한다고 가정합니다.

MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
var value = ms.GetTotalCost().ToString("C"); 

this.Dispatcher.BeginInvoke(new Action(() => lblTotalCost.Text = value)); 
+0

훨씬 나아! 감사! 그럴 수는 있겠지만, 진행 상황을 이해하거나 이론을 확인하지 않고 변경을 구현하기를 원하지는 않았습니다. 도움을 감사하십시오! – Nullqwerty

2

는 즉시 (그 Dispatcher.BeginInvoke 전화를 통해) 실제 작업을 수행하는 사용자의 UI 스레드에 다시 호출하는 다른 스레드를 만들 수 있습니다.

은 당신이 원하는 것은 장기 실행 작업, 을하기 위해 배경 스레드에 대한 다음 다시 UI에 전화 :

new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate() 
{ 
    MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
    var v = ms.GetTotalCost(); 
    Action del = delegate() 
    { 
     lblTotalCost.Text = v.ToString("C"); 
    }; 

    this.Dispatcher.BeginInvoke(del); 
})).Start(); 
관련 문제