1

このコードに問題があります。関数は音楽トラックを再生しているため、実行が完了するまでに時間がかかります.... ただし、スレッド化されていても、完了するまで返されず、プログラムの残りの部分が停止します。プログラムは続行するが、音楽は独自のスレッドに保持するように関数を終了させることはできますか? どんな解決策でも大歓迎です。

using System;
using Gtk;
using NAudio;
using NAudio.Wave;
using System.Threading;

public class Trackbox {

    public static void Main() {
        Application.Init();

        //Create the Window
        Window myWin = new Window("Trackbox");
        myWin.SetIconFromFile("Assets//logo.png");
        myWin.Resize(200, 100);


        //Add the label to the form     
        //myWin.Add(myLabel);

        Button playButton = new Button("Play Sound");
        //This when playwav is called here, the rest of the application waits for it to finish playing

        playButton.Clicked += new EventHandler(playWav);
        myWin.Add(playButton);

        myWin.DeleteEvent += delegate { Application.Quit(); };
        //Show Everything     
        myWin.ShowAll();


        Application.Run();


    }

    private static void playWav(object sender, EventArgs e)
    {
        var soundFile = @"C:\sound.wav";
        using (var wfr = new WaveFileReader(soundFile))
        using (WaveChannel32 wc = new WaveChannel32(wfr) { PadWithZeroes = false })
        using (var audioOutput = new DirectSoundOut())
        {
            audioOutput.Init(wc);

            audioOutput.Play();

            while (audioOutput.PlaybackState != PlaybackState.Stopped)
            {
                Thread.Sleep(20);
            }

            audioOutput.Stop();
        }
    }
}

助けてくれてありがとう。アイデアがあれば投稿してください。

4

2 に答える 2

0

DirectSoundOutはすでに独自の再生スレッドを作成しています。Thread.Sleepスレッドをブロックしている を完全に取り除き、単に を呼び出しますPlay。イベントをサブスクライブして、PlaybackStopped再生が終了したことを検出します。は、再生が終了した後にaudioOutputできるように、クラス メンバーである必要があります。Dispose

于 2013-05-12T14:31:48.447 に答える