2016-10-14 3 views
-1

상태 표시 줄을 만들고 싶습니다. 상태는 클래스 내부의 모든 메소드에서 설정해야합니다. 상태가 설정된 경우 5000ms가 표시되어야합니다. 5000ms 후 상태는 비어 있어야합니다. 때로는 이전 상태가 여전히 활성 상태 일 때 상태를 설정하려고 할 수도 있습니다. 이 경우 이전 상태를 덮어 쓰고 Task.Delay (5000)를 기다려야합니다. 다시 0으로비동기 작업 취소 및 다시 활성화

내 현재 코드에서 계산을 시작해야하는 것은 다음과 같습니다 : 나는 그것이 실행되기 전에 작업을 취소하기 때문 작동하지 않는

public CancellationTokenSource tokenSource { get; set; } 
public CancellationToken token { get; set; } 

public async Task SetStatusMessage(string pStatusMessage) 
{ 
    tokenSource.Cancel(); 

    await Task.Run(async() => 
    { 
    if (token.IsCancellationRequested) 
    { 
     token.ThrowIfCancellationRequested(); 
    } 

    this.Dispatcher.Invoke(() => 
    { 
     this.txtStatusMessage.Text = pStatusMessage; 
    }); 

    await Task.Delay(5000, token); 

    this.Dispatcher.Invoke(() => 
    { 
     this.txtStatusMessage.Text = ""; 
    }); 
}, token); 

public async void AnyMethod() 
{ 
    await this.SetStatusMessage("Hello World"); 
} 

. 그것이 내가 OperationCanceledException (?)을 얻는 이유입니다.

+0

당신은'CancellationTokenSource'를 설정합니까? 취소 할 때마다이 값을 다시 설정해야합니다. 'CancellationTokenSource tokenSource = new CancellationTokenSource();'그리고 토큰을 작업 지연에 전달하십시오. ''기다려라 .Delay (5000, tokenSource.Token); ' –

답변

1

이것이 내가하는 일입니다. async을 사용할 때 Task.Run()을 왜 사용하는지 잘 모르겠습니다.

public async Task SetStatusMessage(string pStatusMessage) 
{ 
    CancellationTokenSource localToken; 

    try 
    { 
     if (tokenSource != null) 
      tokenSource.Cancel(); 

     tokenSource = new CancellationTokenSource(); 

     localToken = this.tokenSource; 

     this.txtStatusMessage.Text = pStatusMessage; 

     await Task.Delay(5000, localToken.token); 

     this.txtStatusMessage.Text = ""; 
    } 
    catch (TaskCanceledException) {} 
    finally 
    { 
     localToken.Dispose(); 
    } 
}