2016-01-15 2 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> (включая те, которые возвращаются методами async), идут прямо от WaitingForActivation к одному из трех завершенных состояний. И никакая задача никогда не раскрывает ее вызывающим абонентам, когда она переходит на Running (если это действительно так).

Единственный способ вы могли бы знать примерно, когда это происходит (помимо опроса, который был бы ужасно) было бы, если обеспечить, чтобы все задачи были запланированы на пользовательских TaskScheduler и, таким образом, знал, когда вы собирались выполнить их. Но, как я уже сказал, вы действительно плаваете вверх по течению здесь и должны переосмыслить любой дизайн, который, по вашему мнению, зависит от этого.

Смежные вопросы