如何在子窗口关闭的时候关闭Socket侦听

yyd021 2010-09-08 08:24:11
我有一个子窗口,在窗口启动的时候加载了一个UDP端口监听,这个监听是以独立线程,同步运行的。里面的Socket是线程内定义的局部变量,有没有什么办法,当子窗体关闭时,在修改该变量为全局变量的情况下关闭该Socket在UDP端口上的监听呢。求指点。
我试过定义一个全局的标志位,作为Socket循环监听的条件,当窗口关闭时,修改标志位,这时可以退出侦听,但是还是添加了一个全局变量。总觉得很别扭。
...全文
215 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyd021 2010-09-10
  • 打赏
  • 举报
回复
谢谢各位,结贴了
bloodish 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yyd021 的回复:]
已经通过AutoResetEvent关闭掉一个监听进程,还有一个进程比较难办,这个进程调用不是在的方法不是在From类中,而是在另外一个单独的类中,通过静态方法调用的,想来想去,不知道怎么处理这个进程的问题。
[/Quote]

Form中增加一个AutoResetEvent,
另一个单独类的构造函数中,将这个AutoResetEvent做为参数传入或该类提供一个AutoResetEvent的属性或该类提供一个参数为AutoResetEvent的方法...很多办法可以帮你解决
leonbyron 2010-09-09
  • 打赏
  • 举报
回复
我说得kill不是说要你调用Abort,而是要你温柔的用Event通知线程退出。(其实虽然大家说Abort不好,实践证明,在.net上没什么问题,因为有一个AbortException,在里边做清理工作没什么问题. C++用WinAPI就不行了).另外你Abort退不掉可能是因为你用堵塞式调socket,换成non-block的就好了
yyd021 2010-09-09
  • 打赏
  • 举报
回复
用colseEvent.Waitone(0),调试的时候经常会出现这么一个问题,关闭子窗体的时候收不到信号,不能触发里面的Break语句。
yyd021 2010-09-09
  • 打赏
  • 举报
回复
已经通过AutoResetEvent关闭掉一个监听进程,还有一个进程比较难办,这个进程调用不是在的方法不是在From类中,而是在另外一个单独的类中,通过静态方法调用的,想来想去,不知道怎么处理这个进程的问题。
bloodish 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yyd021 的回复:]
引用 2 楼 leonbyron 的回复:
你不是有根独立的监听线程吗,杀掉它,在它退出时关闭监听

我也想用这个方法,可是我在外部线程用 Thread.Abort();方法,好像杀不掉这个线程,只有在内部调用才有效。

3楼的方法应该可行。如果我有多个端口监控线程,是不是要定义多个同步消息呢
[/Quote]

需要有多个,而且最好要等到所有的线程都退出了,再执行完OnClosing
你可以自己思考一下需要怎么做
yyd021 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 leonbyron 的回复:]
你不是有根独立的监听线程吗,杀掉它,在它退出时关闭监听
[/Quote]
我也想用这个方法,可是我在外部线程用 Thread.Abort();方法,好像杀不掉这个线程,只有在内部调用才有效。

3楼的方法应该可行。如果我有多个端口监控线程,是不是要定义多个同步消息呢
maple10 2010-09-08
  • 打赏
  • 举报
回复
我也遇见这样的问题了,谢谢处理了
bloodish 2010-09-08
  • 打赏
  • 举报
回复
用Event通知,让监听线程退出

AutoResetEvent closeEvent = new AutoResetEvent(fales);

private void ListeningThreadProc()
{
//listening thread
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//init sock
while (true)
{
if (closeEvent.WaitOne(0))
{
break;
}
//todo
//sock.ReceiveFrom()...
}
}

//override OnClosing, set closeEvent
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
closeEvent.Set();
}
leonbyron 2010-09-08
  • 打赏
  • 举报
回复
你不是有根独立的监听线程吗,杀掉它,在它退出时关闭监听
  • 打赏
  • 举报
回复
没意思的问题。你到底有什么bug呢?

111,129

社区成员

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

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

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