2014-09-24 5 views
3

뷰 모델의 속성 중 하나가 서비스 호출로 채워지는 WPF 응용 프로그램이 있습니다. 나는 지금까지 Stephen Cleary의 훌륭한 튜토리얼을 따라왔다. 그는이 일을하는 방법을 설명합니다. here비동기 메서드를 여러 번 호출

제 경우에는 뷰 모델이 응용 프로그램마다 한 번 인스턴스화됩니다. 응용 프로그램은 뷰 모델에서 Initialise 메서드 (사용자 지정 메서드)를 호출하여 뷰 모델이 서비스에 연결하여 속성을 인스턴스화하는 데 필요한 정보를 전달합니다.

문제는 응용 프로그램이 새로운 정보 집합을 전달하면서 Initialize 메서드를 여러 번 (사용자가 무작위로 움직이는) 호출 할 수 있다는 것입니다. 이런 일이 생기면, Initialise가 호출 된 이전에 호출 된 이전 실행 태스크 (있는 경우)를 삭제하고 새로운 정보 세트로 서비스를 호출하고 해당 속성이 최신 호출의 결과에만 바인드되는지 확인해야합니다.

이 문제를 해결하기위한 패턴을 제안 할 수 있습니까? 기본적으로 비동기 메서드를 여러 번 호출하지만 마지막 결과 만 유지합니다.

+0

여러 번 동시에 호출 하시겠습니까? 또는 귀하의 응용 프로그램은'Initialize' 메서드를 몇 번 호출하지만 호출간에 차이는 있습니까? –

+0

초기화 메서드는 사용자가 단추를 클릭 할 때 호출되므로 호출은 동시지만 순차적이지 않습니다. – Nikhil

답변

1

기본적으로 Initialize 메서드의 이전 호출을 취소하려고합니다. 그리고 TPL에서 무언가를 취소하려면 보통 CancellationToken을 사용해야합니다.

여기에서 할 수있는 방법은 Initialize의 마지막 호출 취소를 나타내는 뷰 모델에 CancellationTokenSource 유형의 필드를 갖는 것입니다. Initialize을 실행하면 이전 호출을 취소하고 자체 취소를 설정하고 서비스를 호출 한 다음 취소가 요청되지 않은 경우에만 속성을 설정합니다. 코드에서 : 서비스는 지원 취소를 호출하는 경우

class ViewModel 
{ 
    // default value just to avoid a null check 
    private CancellationTokenSource intializationCancellation = 
     new CancellationTokenSource(); 

    public async Task InitializeAsync(int parameter) 
    { 
     // cancel previous initialization, if any 
     intializationCancellation.Cancel(); 

     var cts = new CancellationTokenSource(); 
     intializationCancellation = cts; 

     var value = await GetValueaAsync(parameter); 

     if (cts.Token.IsCancellationRequested) 
      return; 

     Value = value; 
    } 

    private async Task<string> GetValueAsync(int parameter) 
    { 
     // call the external service here 
    } 

    public string Value { get; private set; } 
} 

, 당신은 어떤 자원을 절약 할 가능성이있는, 너무 그것에 CancellationToken을 통과해야한다. 그럴 경우, 결과가 OperationCanceledException 인 것을 잊지 말아야합니다 (취소 된 경우에도 Initialize을 던지기를 원하지 않는다고 생각하기 때문에).

+0

귀하의 답변은 텍스트 북이지만 내 문제에는 적용 할 수 없습니다. COM Interop의 높은 수준을 감안할 때이 문제를 해결하는 데 도움이되는 직접적인 패턴이 없었습니다. 작업을 실행하는 스레드가 TPL이 보장하지 않는 STA가되도록해야하므로 상황이 복잡해졌습니다. 대체로 나는 공정한 비트를 재 설계해야했지만 지금은 원하는대로 작업하고 있습니다. 어쨌든 고마워요! – Nikhil

관련 문제