2016-01-15 38 views
2

我正在寫一個運行任務並根據this通知的類。當Task.Status更改爲運行時,是否有任何通知?

我想不出一個解決方案的一個問題是如何在Task.Status從TaskStatus.WaitingForActivation變爲TaskStatus.Running時通知。

縮短下面的代碼:

using System.ComponentModel; 
using System.Runtime.CompilerServices; 
using System.Threading.Tasks; 

public abstract class ExecutionTracker : INotifyPropertyChanged 
{ 
    protected ExecutionTracker(Task task) 
    { 
     Task = task; 
     AwaitTask(task); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public Task Task { get; } 

    public TaskStatus Status => Task.Status; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private async void AwaitTask(Task task) 
    { 
     try 
     { 
      // This is where status goes from WaitingForActivation to Running 
      // and I want to do OnPropertyChanged(nameof(Status)) when it happens. 
      // A hack would be setting a flag awaiting = true here and return TaskStatus.Running if the flag is true. 
      //^feels nasty 
      await task.ConfigureAwait(false); 
     } 
      // ReSharper disable once EmptyGeneralCatchClause We don't want to propagate errors here. Just make them bindable. 
     catch 
     { 
     } 

     // Signal propertychanges depending on result 
    } 
} 

回答

6

你不能(有效)。如果你認爲你需要這個,你可能做錯了什麼,或者做出了一些無效的假設。

許多任務從未轉換到TaskStatus.Running狀態。例如,從TaskCompletionSource<T>創建的所有任務(包括由異步方法返回的任務)將從WaitingForActivation直接轉到3個完成狀態之一。當它轉換到Running時,任何任務都不會公開給它的調用者(如果確實如此,它完全可以)。

你可能知道大致當它發生時(除了投票,這將是可怕的)是,如果你確保所有的任務都安排在您的自定義TaskScheduler,從而知道什麼時候你要執行的唯一途徑他們。但正如我所說,你真的在​​上游游泳,應該重新考慮你認爲依賴於此的任何設計。

相關問題