我看到了類似的問題,但似乎沒有人回答我的問題。基本線程問題
我想了解一般的線程,但只是使用C#來探索它們。
所以我有這個在我的主要():
var sp = new SongPlayer();
sp.Play(path);
和播放功能如下:
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。它表示加入阻止調用線程,直到當前線程終止。但是當我追蹤它時,它剛剛開始播放mp3,並且控制流也一直保持在主線程中。那麼它是什麼意思呢阻止了主線程,顯然不是這樣做的......
其次,如果我在第一個之後再添加sp.Play(path2)
,那麼執行該命令會停止第一個,然後開始第二個。到底發生了什麼?當我在第二個線程上執行Join時,C#是否正在執行內存管理並關閉第一個線程?因爲我分配給相同的變量?爲什麼它不能同時播放它們?
感謝
是有道理的。我正在使用WMPlib.WindowsMediaPlayer,我猜它是異步播放的,而我創建的線程只是臨時存在才能關閉媒體播放器,然後終止。第二個播放停止了第一個,因爲我使用的是同一個媒體播放器對象。如果我每次都創建一個新的,那麼它並行播放。謝謝 – shek