好吧,这是代码:
private void Receivev2()
{
try
{
using (UdpClient udpclient = new UdpClient(1500))
{
while (connect == true)
{
byte[] byteData = udpclient.Receive(ref remoteEP);
waveProvider.AddSamples(byteData, 0, byteData.Length);
if (Record == true)
{
waveWriter.Write(byteData, 0, byteData.Length);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "VoiceChat-Receive ()", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
它在一个线程上,而且,它从 udp 接收数据并播放它,没什么奇怪的。
但是,我的问题是让它正常停止,或者好吧,不知道如何表达。
但是让我们说,我启动了线程并且它循环了。 然后,如果我关闭应用程序,应用程序将不会“关闭”,因为线程没有关闭。
现在为了解决这个问题,我使用 IsBackground = true。
但我不确定这是否是最佳方法,感觉它只会强制它关闭,例如 ProcessKill 或其他东西。
也许这是正确的方法,我不知道。
请就此给我建议。
最佳答案
诀窍是调用UdpClient.Close
。这将取消任何挂起的操作,并“戳”Receive
方法以抛出 SocketException
(如果它处于阻塞状态)。显然,您必须从另一个线程调用Close
,这意味着您需要稍微重构代码,以便udpclient
不再是局部变量。您还需要将 connect
设置为 false,以便循环结束。
总结步骤如下。
- 调用
Close
以防止Receive
阻塞。 - 将
connect
设置为 false。 - 重构您的代码以使上述成为可能。
关于c# - 线程循环,以最佳方式关闭它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18049972/