我看到了类似的问题,但没有一个似乎回答了我的问题。
我试图理解线程,但只是使用C#来探索它们。
因此,我在我的主函数中有这样的代码:
var sp = new SongPlayer();
sp.Play(path);
而Play功能看起来像这样:
public void Play(string path)
{
if (path.EndsWith("mp3"))
songThread = new System.Threading.Thread(() => PlayMp3(path));
else if (path.EndsWith("wav"))
songThread = new System.Threading.Thread(() => PlayWav(path));
songThread.Start();
songThread.Join();
}
(songThread是System.Threading.Thread类型)
有人能向我解释一下背后到底发生了什么吗?
如果我添加一个断点并逐步执行,当我执行songThread.Join()时,mp3开始播放。我猜想它不会在调用Start()后立即开始播放,因为控制流仍在主线程中。如果我没有Join语句,而是使用Thread.Sleep(),那么子线程也会执行,但我的问题是关于Join的。它说Join阻止调用线程直到当前线程终止。但是当我跟踪它时,它只是开始播放mp3,并且控制流也在主线程中继续进行。那么它是什么意思阻止了主线程,显然它并没有这样做...
其次,如果我在第一个sp.Play(path2)
之后再添加另一个,则执行该命令会停止第一个并开始第二个。这里到底发生了什么?是C#进行内存管理并在我对同一变量执行第二个线程的Join时杀死第一个线程吗?为什么它不能同时播放两个线程?
谢谢