c# - 线程循环,以最佳方式关闭它

标签 c# multithreading loops

好吧,这是代码:

    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/

相关文章:

c# - 使用 T4 模板共享项目

c# - 向其他进程发送消息

c# - 结合 Interlocked.Increment 和 Interlocked.Exchange

java - 有条件地打破 Java 中的 for 循环

c++ - C++ 中的无限循环

java - 剪刀石头布游戏 3 中最佳 2 循环问题

c# - 使用 REST API 在 Azure 中创建表

c# - 先进先出减数量库存?

java - 多线程Java程序中的连接池

c - 哪种是实现 TCP/UDP 服务器的最佳方式?在线程或进程中处理每个传入请求