0

xミリ秒ごとに再描画する(タイマーからの)イベントハンドラーがあります。

async void メソッドを使用することは (明らかに) ベスト プラクティスではありませんが、開発者は他のメソッドからイベント ハンドラーを呼び出さないため、これは明らかにイベント ハンドラーには当てはまりません。

私の問題は、プロセッサのワークロードが重い場合 (バックグラウンド タスクなど)、再描画の呼び出しが重複して行われることに気付きました。

描画が完了したことを示すフラグ (bool 変数) を設定する (このフラグが true でない限り、描画メソッドを呼び出さない) ことでこれを回避できましたが、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

MSDN マガジンの 2013 年 3 月号の記事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) 私が完了条件をチェックしていないため、Microsoft が私のアプリを拒否する理由はほとんどありません。(3) 私の描画方法は今のところ中断されていません(4)私の最善の努力にもかかわらず、それは期待どおりに機能しています;)

短所:フレームがいつ描画されるかを実際にスケジュールしていません。そのため、タイムアウトを 1000 ミリ秒に設定して、それが (最大で) 1 Hz 呼び出されると考える代わりに、ハイエンド マシンではより高速なフレーム数が表示されます (唯一の固定長は DrawVideoFrame() への呼び出しの間であるため)。いわば、それが非同期波をサーフィンする性質だと思います。

于 2013-03-23T17:43:17.883 に答える