2016-10-14 6 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();'を呼び出し、そのトークンをタスク遅延に渡します。 '待ち時間Task.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(); 
    } 
} 
関連する問題