2014-03-24 6 views
-1

단추를 클릭 할 때마다 서버를 1 초마다 폴링하는 StartContinuousThread에 대한 호출이 발생했습니다.비동기 스레드 수명 및 WPF UI 업데이트

public class ThreadsWindow 
{ 
    CancellationTokenSource wtoken = new CancellationTokenSource(); 
    private void btnStartTest_Click(object sender, RoutedEventArgs e) 
    { 
     StartContinuousThread(); 
    } 

    void StartContinuousThread() 
    { 
     while(true) 
     { 
      var fact = Task.Factory.StartNew(() => 
      { 
       CallServer(); 
       Task.Delay(1000, wtoken.Token); 
      }, 
      wtoken.Token); 
     } 
    } 
} 

StartContinuousThread 실행이 시작되지만 btnStartTest_Click event handler 실행을 종료한다.

의 경우에 StartContinuousThread method은 어떻게 UI를 업데이트 할 수 있습니까?

재 연결을위한 대기 키워드가 없기 때문에 StartContinuousThread도 이벤트 처리기로 종료되는지 궁금합니다.

도와주세요!

+0

해당 코드에는 몇 가지 문제점이 있습니다. 정확히 무엇을하려는 것입니까? – dcastro

+0

'CallServer'가 반환 된 후에 UI 스레드를 업데이트 하시겠습니까? – dcastro

답변

2

목표가 매초마다 서버를 폴링하는 경우 많은 문제가 있습니다.

  1. 루프가 없습니다. 메서드를 한 번 실행 한 다음 중지합니다.

  2. Delay을 사용하여 작업을 만든 다음 무시하십시오. 당신은 나머지 작업을하기 위해 그 작업을 계속해서 만들어야합니다. 실제로는 아무 것도하지 않습니다. 당신은 몇 가지 코드를 매 초마다 실행하는 타이머를 사용하는, C 번호의 이전 버전을 것 사용하고 특히,

    private async Task StartContinuousThread(CancellationToken token) 
    { 
        while (true) 
        { 
         token.ThrowIfCancellationRequested(); 
         await Task.Run(() => CallServer()); 
         await Task.Delay(1000, token); 
        } 
    } 
    

    또 다른 가능성 : 여기

는 이러한 문제를 해결하는 구현 .

UI를 업데이트하는 방법은 다음과 같습니다. 이 예에서 Task.Run에 대한 호출 외부 어디서나 자유롭게 할 수 있습니다. 귀하의 예제에서는 UI의 동기화 컨텍스트 캡처 및 게시와 같은 UI 스레드로 마샬링하기 위해 몇 가지 메커니즘을 사용해야합니다.

+0

감사합니다. UI 스레드로 마샬링하는 것에 대해 조금 설명해 주시겠습니까? btb 나는 여기에 게시하는 동안 루프 동안보고 싶었어. – Abhijeet

+0

@lakshyaleader 더 많이 알고 싶다면 쉽게 연구 할 수있는 널리 논의 된 주제입니다. – Servy