0

私は壁にぶつかっていて、皆さんが次のことで私を助けてくれることを願ってここに来ました:

定期的に(700ミリ秒ごとに)音が鳴るwp7アプリを設計しています。これらのサウンドをUIスレッド以外のスレッドで再生したいと思います。したがって、dispatch timerこれらのサウンドが鳴っている間、UIスレッドが頻繁に使用されるため、を使用することはできません。

この問題を見て、私はコマンドでを作成しbackgroundworkerました。Thread.Sleep(700)これは機能しますが、予想どおり、音が鳴るまでに700ミリ秒以上かかる場合があります。だから時々私は遅れを聞く。

backgroundworkerだから私はあなたたちに目を向けます-どうすれば、または別のスレッドで700ミリ秒ごとに音が鳴るのに近づくことができますか?Timer賢明な考えですか?

わかりやすく説明するためのコードを次に示します。

    private void RunBackgroundWorker()
    {
        backgroundWorker = new BackgroundWorker ();
        backgroundWorker.WorkerSupportsCancellation = true;
        backgroundWorker.DoWork += new DoWorkEventHandler(StartSounds); 

        backgroundWorker.RunWorkerAsync();
    }


    public void StartSounds(object sender, EventArgs e)
    {

        for (currentsoundchoice = 0; currentsoundchoice <= max; currentsoundchoice ++)
        {
            if (backgroundWorker.CancellationPending == true)
            {
                backgroundWorker.CancelAsync();
                currentsoundchoice = max + 1; //just to ensure it stops.
            }
            else
            {
                Time_Tick();
                if (max == 12)
                    currentsoundchoice = -1; //repeats the loop when it reaches max.

            }

        }
    }


    void Time_Tick()
    {
        Thread.Sleep(700);
        FrameworkDispatcher.Update();

        switch (sounds)
            case 0: //code 
                    break;
            // ETC, So forth.......
    }

タイマーを使用することもこれを行うための良い方法だと聞きましたが、バックグラウンドワーカーでタイマーを実行することは可能ですか?もしそうなら、それはどのように構成されますか?さらに重要なことは、聞こえる遅延なしに、希望する700ミリ秒の発火時間に近づけることができるでしょうか。

ありがとうございました。

4

1 に答える 1

1

BackgroundWorkerここでの選択は間違っています。バックグラウンド スレッドでコストのかかる作業を実行し、結果を UI に同期できるように設計されています。同期は必要ありません。さらに、作業は 1 回限りの作業としてではなく、定期的に行う必要があります。

A のTimer方が適しています。これにより、700 ミリ秒ごとにロジックを実行Thread.Sleep()し、現在のコードにある厄介な呼び出しを削除できます。はTimerバックグラウンド スレッドを使用BackgroundWorkerします。

ただし、700ms が経過する前に実行されないことが保証されるだけであることに注意してください。たとえば、デバイスを完全に叩いている場合、定期的な間隔でコードを実行するのに苦労し、ラグが発生する可能性があります。

于 2012-06-10T09:13:04.360 に答える