gpt4 book ai didi

c# - 基本线程问题

转载 作者:行者123 更新时间:2023-11-30 15:29:36 26 4
gpt4 key购买 nike

我看到了类似的问题,但似乎没有一个能回答我的问题。

我试图从总体上理解线程,但只是使用 C# 来探索它们。

所以我在 main() 中有这个:

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 Blocks the calling thread until the current thread terminates. 但是当我跟踪它时,它只是开始播放 mp3 并且控制流也在主线程中继续进行。那么它阻塞主线程是什么意思,它显然不是那样做的......

其次,如果我在第一个之后添加另一个 sp.Play(path2),那么执行它会停止第一个并启动第二个。这里到底发生了什么?当我在第二个线程上执行 Join 时,是 C# 进行内存管理并杀死第一个线程吗?因为我分配给同一个变量?为什么不同时播放它们?

谢谢

最佳答案

首先,在几乎所有情况下,创建一个新线程只是为了立即 Join 没有实际意义。您也可以只执行您在原始线程中执行的任何操作;它会做同样的事情,而无需花时间执行创建、管理和销毁线程等非常昂贵的工作。

至于为什么你的程序在 Join 的情况下继续运行,那是因为你的 PlayMp3PlayWav 方法是异步的。他们开始播放音乐,但这些方法在歌曲播放完毕之前不会阻塞;他们几乎立即返回。因为它们返回,线程几乎立即完成,所以您的 Join 方法几乎立即返回。如果您的线程正在执行的工作实际上花费了相当多的时间,那么您会看到 Join 正在等待它完成。

至于为什么随后调用 Play 会停止前面的歌曲,这与此处显示的代码完全无关。您的 PlayMp3PlayWav 方法似乎设计为如果在另一首歌曲仍在播放时调用它们,它们将停止播放这些歌曲。它与您显示的代码无关。

关于c# - 基本线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23429935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com