C#服务程序监听端口问题

倒退一天 2010-05-21 06:15:57
具体描述:C#服务程序中,启动监听端口功能,挂起接收客户端连接,有连接就发出HELLO字符串。待启动服务后,再关闭,则此服务进程延时10多秒后才结束。经过多方面测试,始终无法关闭主线程的时候就结束掉子线程。(前提是不允许强制关闭进程),用什么办法才能是服务停止,进程马上就关闭。或者这段代码要怎么改。
代码如下:
Thread threadsockt = null;
protected override void OnStart(string[] args)
{
threadsockt = new Thread(new ThreadStart(PortBind));
threadsockt.Start();
}
private void PortBind()
{
int port = int.Parse(System.Configuration.ConfigurationManager.AppSettings["PortTcp"].ToString());
IPAddress serverIP = IPAddress.Any;
IPEndPoint server = new IPEndPoint(serverIP, port);
TcpListener listener = new TcpListener(server);
listener.Start();

while (true)
{
try
{
TcpClient client = listener.AcceptTcpClient();
Socket clientsocket = client.Client;

Thread threadback = new Thread(new ParameterizedThreadStart(this.mainServerProcess));
threadback.IsBackground = true;
threadback.Start(clientsocket);

}
catch (Exception e)
{
writeError.WriteLog("PortBind", e.Message);
}
}
}
private void mainServerProcess(object socket)
{
Socket clientsockt = socket as Socket;
byte[] buffer = new byte[5];
string sendStr = "HELLO";
buffer = System.Text.Encoding.Default.GetBytes(sendStr);
clientsockt.Send(buffer);
clientsockt.Close();
}
protected override void OnStop()
{
我要在此处写什么代码才能在停止服务的时候,马上就能结束进程。(不要跟我说强制关闭)
但是问题在没有客户端连接的时候,挂起的监听怎么会产生子线程呢?但测试事实就是因为子线程没结束而延迟了进程的关闭。哪位高手指教一二。
//System.Environment.Exit(0);
//threadsockt.Abort();
}
...全文
523 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
倒退一天 2010-05-22
  • 打赏
  • 举报
回复
继续在线等待
倒退一天 2010-05-22
  • 打赏
  • 举报
回复
还是自己丰衣足食的好,终于解决了。
倒退一天 2010-05-22
  • 打赏
  • 举报
回复
怎么没人指教啊?是不是嫌问题太低端了。或者分不够?分不够可以再加,只要能吧原理讲明白马上就结贴
skep99 2010-05-21
  • 打赏
  • 举报
回复
即使用threadsockt.isbackground=true;的方法
也是在父线程结束的时候调用子线程才abort()方法,中断线程噢~~
倒退一天 2010-05-21
  • 打赏
  • 举报
回复
刚楼上有的兄弟说把主线程也加上IsBackground=true,这个我当然试过了,不起作用。还包括把主线程改成全局变量,然后在OnStop方法中结束都试过了。继续等待高手解答,最好说上理论。万分感谢
倒退一天 2010-05-21
  • 打赏
  • 举报
回复
我上面都已经有这句代码了,呵呵。这个我知道。可是问题是,进程还是会延迟结束。现在我的问题是,哪里会产生子线程呢。测试的时候并没有客户端连接,按道理,主线程关闭时,是不需要等待子线程关闭的。
doubleu2005 2010-05-21
  • 打赏
  • 举报
回复
threadsockt.isbackground=true;
后台线程吧?
老青菜 2010-05-21
  • 打赏
  • 举报
回复
嗯,楼主试试加上threadsockt.isbackground=true;

这句话的意思就是窗体关闭了,这个线程就随着主线程的结束而结束了吧
sprc_lcl 2010-05-21
  • 打赏
  • 举报
回复
你的主线程threadsockt加上isbackground试了吗
sprc_lcl 2010-05-21
  • 打赏
  • 举报
回复

Thread thr;
thr.IsBackground = true;
deknight 2010-05-21
  • 打赏
  • 举报
回复
先顶,准备回家

110,534

社区成员

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

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

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