0

我有一个事件处理程序(来自计时器),每 x 毫秒重绘一次。

尽管使用 async void 方法(显然)不是最佳实践,但对于事件处理程序显然不是这样,因为开发人员不会从其他方法调用它们。

我的问题是我注意到当处理器的工作量很大(后台任务等)时,会重复调用重绘。

我已经能够通过设置一个标志(布尔变量)来指示绘图已完成(并且除非此标志为真,否则不调用我的 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();    
    }
}

此外,您不能将锁添加到异步方法。

这里的最佳做法是什么?我该怎么办?

4

2 回答 2

1

您是否看过2013 年 3 月号 MSDN 杂志上的这篇文章http://msdn.microsoft.com/en-us/magazine/jj991977.aspx ?本文的第一部分在一定程度上讨论了异步事件处理程序。它不是您问题的直接解决方案,但它可能会给您一个提示。

于 2013-03-23T14:36:27.973 回答
1

我的方法现在看起来更像这样:

private void _timer_Tick(object sender, object e)
{
    _timer.Stop();

    DrawVideoFrame();    // calls timer.Start() as one the last line
}

我看到了这个解决方案的优点和缺点:

优点:(1)感觉不像是一个杂物(sp?)。(2) 微软拒绝我的应用程序的理由较少,因为我没有检查完成条件。(3) 我的画法现在绝对不会被打断。(4)尽管我尽了最大的努力,但它正在按预期工作;)

缺点:我并没有真正安排何时绘制框架。因此,与其将超时设置为 1000 毫秒并认为它会(最多)1 Hz 被调用,不如高端机器会看到更快的帧数(因为唯一固定的时间长度是调用 DrawVideoFrame() 之间的时间)。我想这就是冲浪异步波的本质,可以这么说。

于 2013-03-23T17:43:17.883 回答