C# 重新启动正在运行的线程
我是线程新手,需要很多帮助。 我有基于启动线程的事件的代码。问题是我丢失了对线程和thread.abort()的引用;不会停止它,因此我的应用程序不会停止。谢谢C# 重新启动正在运行的线程,c#,multithreading,gtk#,C#,Multithreading,Gtk#,我是线程新手,需要很多帮助。 我有基于启动线程的事件的代码。问题是我丢失了对线程和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() { A
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();
}
}
}
请给出关于这种情况的任何建议。谢谢好了,不用深入研究线程以及如何使用线程等等(我建议阅读更多关于C#线程的内容,然后再试一次——CLR via C#一书中有很多关于线程的内容,当然,互联网上有很多网站),让你的应用程序在这种情况下死掉,您可能应该将线程设置为背景线程:
private static void playWav(object sender, EventArgs e) {
//Reference to Thread
thread = new Thread(playWavThread);
thread.IsBackground = true;
thread.Start();
}
非后台线程可以防止应用程序终止,但后台线程在进程关闭时会很高兴地死去。对于任何对正在运行的应用程序不重要的线程,您应该将其设置为后台线程。此外,根据最终目标,您可能会考虑改用。它似乎提供了实现线程取消所需的功能。另外,这样做的好处是使用BackgroundWorker会更快,因为他们使用线程池中的线程。缺点是可用的线程数量有限,因此如果您使用了大量线程,它们可以为可用的线程池线程而相互竞争。谢谢,非常有效。你能解释一下为什么背景线会起作用吗线程可以是背景线程,也可以是前景线程。后台线程与前台线程相同,只是后台线程不阻止进程终止。一旦属于某个进程的所有前台线程都终止,公共语言运行库就会结束该进程。所有剩余的后台线程都已停止且未完成。