繁体   English   中英

检查void async方法的完成情况

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM