Я видел похожие вопросы, но никто, казалось, не ответил мне.Основные вопросы по заполнению
Я пытаюсь понять потоки вообще, но просто используя 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# выполнением управления памятью и уничтожением первого потока, когда я выполняю объединение во втором потоке? Потому что я назначаю одну и ту же переменную? Почему бы им не играть параллельно?
Благодаря
Да имеет смысл. Я использую WMPlib.WindowsMediaPlayer, который, как я думаю, асинхронно воспроизводит его, и поток, который я создаю, существует только временно, чтобы отключить медиа-плеер, а затем завершается. Также вторая игра останавливает первую, потому что я использовал тот же объект медиаплеера. Если я создаю новый каждый раз, то он играет параллельно. Спасибо – shek