簡體   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