[英]checking completion of void async method
我有一个事件处理程序(来自一个计时器),每隔x毫秒重绘一次。
即使使用异步void方法(显然)不是最佳实践,但事实处理程序显然不是这样,因为开发人员不会从其他方法调用它们。
我的问题是我注意到当处理器工作负载繁重(后台任务等)时,会重叠调用重绘。
我已经能够通过设置一个标志(bool变量)来表明绘图已经完成(并且不调用我的绘制方法,除非此标志为真),但我听说过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();
}
}
此外,您无法向异步方法添加锁定。
这里的最佳做法是什么? 我该怎么办呢?
您是否从2013年3月的MSDN杂志上看过这篇文章http://msdn.microsoft.com/en-us/magazine/jj991977.aspx ? 本文的第一部分在某种程度上讨论了异步事件处理程序。 它不是您问题的直接解决方案,但它可能会给您一个提示。
我的方法现在看起来更像这样:
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()之间)。 我想这就是冲浪异步波的本质,可以这么说。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.