gpt4 book ai didi

c# - 异步友好的 DispatcherTimer 包装器/子类

转载 作者:太空狗 更新时间:2023-10-30 00:15:40 24 4
gpt4 key购买 nike

我的代码中运行了一个 DispatcherTimer,它每 30 秒触发一次,从服务器更新系统状态。即使我正在调试我的服务器代码,计时器也会在客户端中触发,所以如果我已经调试了 5 分钟,我可能会在客户端中出现十几个超时。最后决定我需要解决这个问题,所以希望制作一个更 async/await 友好的 DispatcherTimer。

  • DispatcherTimer 中运行的代码必须是可配置的,无论它是否可重入(即,如果任务已经在运行,则不应尝试再次运行它)
  • 应该是基于任务的(无论这是否需要我实际上在根部暴露任务是一个灰色区域)
  • 应该能够运行异步代码并等待完成任务
  • 它是否包装或扩展 DispatcherTimer 可能并不重要,但如果您不知道如何使用它,包装它可能会稍微不那么模糊
  • 可能为 UI 公开 IsRunning 的可绑定(bind)属性

最佳答案

这是我想出的。

  • 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; }
}

关于c# - 异步友好的 DispatcherTimer 包装器/子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12442622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com