2013-03-23 37 views
0

我有一个事件处理程序(来自计时器),每x毫秒重绘一次。检查无效异步方法的完成

尽管使用异步无效方法(显然)不是最佳做法,但事实上,事件处理程序显然不适用,因为开发人员不会从其他方法调用它们。

我的问题是我注意到,当处理器工作负载很重(后台任务等)时,重叠的调用被重做。

我已经能够通过设置一个标志(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();  
    } 
} 

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

这里最好的做法是什么?我应该怎么做呢?

+0

这并不回答你的问题,而是使用布尔标志,你可以简单地缓存任务并检查它是否完成。 DrawVideoFrame究竟做了什么? – 2013-03-23 10:42:36

+0

有趣的想法,pm_2。我认为在返回任务的方法完成之前我无法获得任务。 – micahhoover 2013-03-23 17:22:59

+0

否 - 您可以将任务作为变量创建并稍后在流程中使用。 – 2013-03-24 20:22:35

回答

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赫兹,高端机器将看到更快的帧数(因为唯一固定的时间长度是在调用DrawVideoFrame()之间)。我想这就是冲浪异步波的本质,可以这么说。

+1

我在一段时间内写过的程序中做了类似的事情。如果你想接近1Hz,你可以跟踪自上一帧以来的时间并相应地修改定时器值。例如,如果DrawVideoFrame在启动之前花了20ms将计时器设置为1000 - 20。这将在一定程度上补偿机器上变化的速度/负载。它不会是完美的,但会更接近。 – 2013-03-23 21:30:48

+0

@WayneTanner:我得咀嚼一下。好处似乎是一致的。缺点是:如果它需要超过1000毫秒?显然你不能有一个消极的等待时间。如果将其限制为> = 0,则具有一定的一致性,但不一定总是如此。如果时间在两帧之间发生显着变化......我认为这总比没有好。 – micahhoover 2013-04-16 19:01:00

+0

你是对的,这是一个问题,如果你的帧时间> 1000毫秒。它发生在我身上,我为了延迟而将其限制为0,并尽最大努力维持目标帧速率。对于我所做的绝对帧速率并不重要,所以可以接受。 – 2013-04-17 00:22:25