2

好的,这里是代码:

    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 之类的。

也许这是正确的方法,我不知道。

请给我这方面的建议。

4

2 回答 2

2

诀窍是调用UdpClient.Close。这将取消任何挂起的操作并“戳”该Receive方法以抛出 aSocketException如果它被阻塞。显然,您将不得不Close从另一个线程调用,这意味着您需要稍微重构代码,使其udpclient不再是局部变量。您还需要设置connect为 false 以便循环结束。

所以总结一下步骤如下。

  • 调用Close以防止Receive阻塞。
  • 设置connect为假。
  • 重构您的代码以使上述成为可能。
于 2013-08-05T04:49:44.573 回答
0

如果是导入线程,最好不要设置 IsBackground ,因为主线程停止,会被强制停止

停止线程步骤:

1 设置connect=false ,然后主线程休眠一段时间,直到它停止 2 如果线程还活着,你可以中止它,这一步是没有必要的 3 比加入后台线程到主线程

像这样:

        connect= false;

        Thread.Sleep(200);
        if (thread1 != null)
        {
            if (thread1 .IsAlive)
            {
                thread1 .Abort();
                thread1 .Join();
            }
        }
于 2013-08-05T03:57:51.687 回答