这就是我想出的。
SmartDispatcherTimer扩展DispatcherTimer(这是启动和运行它的最简单方法) 
- 有一个
TickTask属性来提供一个Task处理逻辑 
- 有一个
IsReentrant属性(当然,重点是我希望它不能重入,所以通常这是错误的) 
- 它假定您调用的任何内容都是完全可等待的 - 否则您最终将失去重入保护权益
 
用法:  
        var timer = new SmartDispatcherTimer();
        timer.IsReentrant = false;
        timer.Interval = TimeSpan.FromSeconds(30);
        timer.TickTask = async () =>
        {
            StatusMessage = "Updating...";  // MVVM property
            await UpdateSystemStatus(false);
            StatusMessage = "Updated at " + DateTime.Now;
        };
        timer.Start();
这是代码。很想听听对此的任何想法
public class SmartDispatcherTimer : DispatcherTimer
{
    public SmartDispatcherTimer()
    {
        base.Tick += SmartDispatcherTimer_Tick;
    }
    async void SmartDispatcherTimer_Tick(object sender, EventArgs e)
    {
        if (TickTask == null)
        {
            Debug.WriteLine("No task set!");
            return;
        }
        if (IsRunning && !IsReentrant)
        {
            // previous task hasn't completed
            Debug.WriteLine("Task already running");
            return;
        }
        try
        {
            // we're running it now
            IsRunning = true;
            Debug.WriteLine("Running Task");
            await TickTask.Invoke();
            Debug.WriteLine("Task Completed");
        }
        catch (Exception)
        {
            Debug.WriteLine("Task Failed");
        }
        finally
        {
            // allow it to run again
            IsRunning = false;
        }
    }
    public bool IsReentrant { get; set; }
    public bool IsRunning { get; private set; }
    public Func<Task> TickTask { get; set; }
}