これが私が思いついたものです。
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; }
}