2013-03-23 33 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