wpf 在离开一个界面时UdpClient没有释放干净,导致再次进入该界面创建并绑定端口时提示端口被重复占用异常

kgduwu 2014-06-13 06:11:25
就是在进一个界面时,new一个绑定了端口的UdpClient,然后创建一个线程调用它的阻塞接收函数,然后在一个按钮响应中,生成一个线程级定时器,在定时器中调用UdpClient的发送函数发送信息,在离开这个界面时关闭定时器,关闭UdpClient(这样会关闭阻塞接收线程)。

问题就在于我离开这个界面然后又再次进入这个界面太快时,似乎UdpClient还没有释放干净,导致再次创建并绑定端口是提示端口被重复占用异常!
问题是在C#中的WPF框架开发的程序中出现的!
...全文
609 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
霜之咏叹调 2014-07-29
  • 打赏
  • 举报
回复
引用 9 楼 save4me 的回复:
引自udpclient中dispose方法的请教
引用
倒不是说UdpClient的Dispose方法是保护的。它显式实现了IDisposable,所以如果要调用,要显式的用IDisposable接口调用:(udpClient as IDisposable).Dispose();或使用using模式(比较好)
修改一下

                //udpclient.Dispose();//释放协议
                (udpclient as IDisposable).Dispose();
[quote=引用 8 楼 kgduwu 的回复:] [quote=引用 5 楼 save4me 的回复:] 引自c# 中我开了线程task 用udpclient接收消息,请问怎么安全关闭这个线程以及udpclient
引用
udpclient.Close();//关闭协议 udpclient.Dispose();//释放协议 udpclient = null;//为协议至空值 t.DisableComObjectEagerCleanup();//直接释放掉当前线程
试一下这样释放快不快
.Dispose();是保护函数,不能调用啊? [/quote][/quote] 按照你的方法调用了dispose,还是不行呀。还会提示端口被占用
kgduwu 2014-06-15
  • 打赏
  • 举报
回复
引用 5 楼 save4me 的回复:
引自c# 中我开了线程task 用udpclient接收消息,请问怎么安全关闭这个线程以及udpclient
引用
udpclient.Close();//关闭协议 udpclient.Dispose();//释放协议 udpclient = null;//为协议至空值 t.DisableComObjectEagerCleanup();//直接释放掉当前线程
试一下这样释放快不快
.Dispose();是保护函数,不能调用啊?
save4me 2014-06-15
  • 打赏
  • 举报
回复
引自udpclient中dispose方法的请教
引用
倒不是说UdpClient的Dispose方法是保护的。它显式实现了IDisposable,所以如果要调用,要显式的用IDisposable接口调用:(udpClient as IDisposable).Dispose();或使用using模式(比较好)
修改一下

                //udpclient.Dispose();//释放协议
                (udpclient as IDisposable).Dispose();
引用 8 楼 kgduwu 的回复:
[quote=引用 5 楼 save4me 的回复:] 引自c# 中我开了线程task 用udpclient接收消息,请问怎么安全关闭这个线程以及udpclient
引用
udpclient.Close();//关闭协议 udpclient.Dispose();//释放协议 udpclient = null;//为协议至空值 t.DisableComObjectEagerCleanup();//直接释放掉当前线程
试一下这样释放快不快
.Dispose();是保护函数,不能调用啊? [/quote]
  • 打赏
  • 举报
回复
在一个进程中,不要随便重复绑定同一个端口号。
  • 打赏
  • 举报
回复
一个端口绑定的“释放”,你要允许人家最多可能有几分钟(之久的)延迟。这是window操作系统控制的,跟.net无关。 如果知道windows系统的这个规范,你在设计你的程序时就应该改变自己的设计。
save4me 2014-06-14
  • 打赏
  • 举报
回复
引自c# 中我开了线程task 用udpclient接收消息,请问怎么安全关闭这个线程以及udpclient
引用
udpclient.Close();//关闭协议 udpclient.Dispose();//释放协议 udpclient = null;//为协议至空值 t.DisableComObjectEagerCleanup();//直接释放掉当前线程
试一下这样释放快不快
kgduwu 2014-06-13
  • 打赏
  • 举报
回复
延时不是太好的解决方案啊,会导致界面切换时卡顿! 直接使用Socket,如果界面切换太快,Socket释放不干净,一样还是会在并bind时循环延时,治标不治本啊,并且本来使用UdpClient就是为了简单易用方便,结果又搞到Socket层级去了。 有没有其它能在界面离开时,强力快速清理释放UdpClient的方法,还有看MSDN的解释,似乎定时器的Dispose();也不是及时进行的,调用定时器的Dispose()后,好像如果系统中已经产生了Time消息没有执行,wpf还是会将这个Time消息执行完毕是吗? 感觉这个定时器的Dispose()没有MFC中的KillTimer(ID)强啊,MFC中的KillTimer(ID)执行后这个ID的Timer就再也不会再次进入定时器回调函数了,感觉wpf对定时器怎么越改越回去了啊!!!
sunny906 2014-06-13
  • 打赏
  • 举报
回复
为了防止无限循环判断,你也可以在循环里加入判断次数

            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            EndPoint localEP = new IPEndPoint(IPAddress.Any, 1001);
            int n = 0;
            while (true)  ////循环判断端口是否被占用,没有就退出;如果被占用,循环10次就退出
            {
                if (n == 10)
                { 
                    break;
                }
                try
                {
                    socket.Bind(localEP);
                    break;
                }
                catch 
                {
                    n++;
                }
                finally
                {
                    Thread.Sleep(60000);
                }
            }
的限制
sunny906 2014-06-13
  • 打赏
  • 举报
回复
udp通信,客户端不需要绑定端口,客户端只需要sendto数据包给服务端就可以了,真正需要做端口绑定的是服务端

            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            EndPoint localEP = new IPEndPoint(IPAddress.Any, 1001);
            while (true)  //循环判断端口是否被占用,没有就退出
            {
                try
                {
                    socket.Bind(localEP);
                    break;
                }
                catch { }
                finally
                {
                    Thread.Sleep(60000);
                }
            }
wangnaisheng 2014-06-13
  • 打赏
  • 举报
回复
进入界面初始化的时候进行延时

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧