0

私はスレッド化が初めてで、多くの助けが必要です。スレッドを開始するイベントに基づくコードがあります。問題は、スレッドと thread.abort(); への参照が失われることです。停止しないため、アプリケーションは停止しません。ありがとう

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

public class Trackbox {
public static Thread thread;
public static void Main() {
    Application.Init();

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


    Button playButton = new Button("Play Sound");
    playButton.Clicked += new EventHandler(playWav);
    myWin.Add(playButton);

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


    Application.Run();


}

private static void exitTrackbox() {
    //Doesn't kill the application
    thread.Abort();
    Application.Quit();
}

private static void playWav(object sender, EventArgs e) {
    //Reference to Thread
    thread = new Thread(playWavThread);
    thread.Start();
}

private static void playWavThread()
{
    var soundFile = @"C:\sound.wav";
    using (var wfr = new WaveFileReader(soundFile))
    using (WaveChannel32 wc = new WaveChannel32(wfr) { PadWithZeroes = false })
    using (var audioOutput = new WaveOut())
    {
        audioOutput.Init(wc);
        audioOutput.Play();
        while (audioOutput.PlaybackState != PlaybackState.Stopped)
        {
            Thread.Sleep(20);
        }
        audioOutput.Stop();
    }

}
}

この状況について何かアドバイスがあればお願いします。ありがとう

4

2 に答える 2

0

スレッド化やスレッドの使用方法などについて深く掘り下げずに (C# でのスレッド化について詳しく読んでから、もう一度試してみることをお勧めします。C# による CLR の本にはスレッド化に関する多くの情報があり、もちろんインターネット上には多くのサイトがあります。 )、この場合にアプリケーションを終了させるには、スレッドをバックグラウンド スレッドとして設定する必要があります。

private static void playWav(object sender, EventArgs e) {
    //Reference to Thread
    thread = new Thread(playWavThread);
    thread.IsBackground = true;
    thread.Start();
}

非バックグラウンド スレッドはアプリケーションの終了を防ぎますが、バックグラウンド スレッドはプロセスのシャットダウン時に喜んで終了します。実行中のアプリケーションにとって重要ではないスレッドについては、バックグラウンド スレッドとして設定する必要があります。

于 2013-05-11T22:27:30.513 に答える