我有一个事件处理程序(来自一个计时器),每隔x毫秒重绘一次。
即使使用异步void方法(显然)不是最佳实践,但事实处理程序显然不是这样,因为开发人员不会从其他方法调用它们。
我的问题是我注意到当处理器负载繁重(后台任务等)时,会重叠调用重绘。
我已经能够通过设置一个标志(bool变量)来表明绘图已经完成(而不是调用我的draw方法,除非这个标志为真),但我听说过Windows商店应用程序可以被拒绝进行异步活动的投票。
private void _timer_Tick(object sender, object e)
{
if (drawingFinished == true)
{
drawingFinished = false;
// drawingFinished set to true at the end of this method
DrawVideoFrame();
}
}
此外,您无法为异步方法添加锁定。
这里的最佳做法是什么?我应该怎么做呢?
答案 0 :(得分:1)
您是否在2013年3月的MSDN杂志上看过这篇文章http://msdn.microsoft.com/en-us/magazine/jj991977.aspx?本文的第一部分在某种程度上讨论了异步事件处理程序。它不是您问题的直接解决方案,但它可能会给您一些提示。
答案 1 :(得分:1)
我的方法现在看起来更像这样:
private void _timer_Tick(object sender, object e)
{
_timer.Stop();
DrawVideoFrame(); // calls timer.Start() as one the last line
}
我看到了这个解决方案的专业人士和对手:
优点:(1)感觉不像kludge(sp?)。 (2)微软拒绝我的应用程序,因为我没有检查完成情况。 (3)我的绘图方法肯定现在没有被打断。 (4)尽管我付出了最大的努力,但仍然按照预期的方式工作;)
缺点:我不再在绘制帧时进行调度。因此,不是将超时设置为1000毫秒并且认为它将被调用(最多)1赫兹,而是高端机器将看到更快的帧数(因为唯一固定的时间长度是在调用DrawVideoFrame()之间)。我想这就是冲浪异步波的本质,可以这么说。