用C#写了个WINDOWS服务,做SOCKET的服务器端
不过在运行一段时间后发现CPU利用率总会升到100%
造成服务器运行缓慢,代码如下
TcpListener tcl = new TcpListener(IPAddress.Parse(fconfig.Server),listenport);
tcl.Start();
while(true)
{
Thread.Sleep(200);
clientsocket = tcl.AcceptSocket();
clientservice = new Thread(new ParameterizedThreadStart(ServerChart));
clientservice.Start(clientsocket.RemoteEndPoint.ToString());
}
在网上查到说是线程一直在运行(while循环),后来加上了 Thread.Sleep(200);效果也不是很明显以前没有做过SOCKET的开发,这个服务端是不能停的。哪位高手能提供更好的方案或解决方法。
不过在运行一段时间后发现CPU利用率总会升到100%
造成服务器运行缓慢,代码如下
TcpListener tcl = new TcpListener(IPAddress.Parse(fconfig.Server),listenport);
tcl.Start();
while(true)
{
Thread.Sleep(200);
clientsocket = tcl.AcceptSocket();
clientservice = new Thread(new ParameterizedThreadStart(ServerChart));
clientservice.Start(clientsocket.RemoteEndPoint.ToString());
}
在网上查到说是线程一直在运行(while循环),后来加上了 Thread.Sleep(200);效果也不是很明显以前没有做过SOCKET的开发,这个服务端是不能停的。哪位高手能提供更好的方案或解决方法。
while(true)
{
Thread.Sleep(200);
clientsocket = tcl.AcceptSocket();
clientservice = new Thread(new ParameterizedThreadStart(ServerChart));
clientservice.Start(clientsocket.RemoteEndPoint.ToString());
} 你在while里无限的创建新线程啊?!
每次循环都创建一个新线程,CPU肯定100%! if(...)
{
clientservice = new Thread(new ParameterizedThreadStart(ServerChart));
clientservice.Start(clientsocket.RemoteEndPoint.ToString());
}
{
Thread.Sleep(200);
clientsocket = tcl.AcceptSocket();
clientservice = new Thread(new ParameterizedThreadStart(ServerChart));
clientservice.Start(clientsocket.RemoteEndPoint.ToString());
} 没命的开线程啊..... 考虑使用异步方式把
http://blog.csdn.net/zgke/archive/2009/01/20/3838844.aspx
千万别这么做
不拖死CPU才怪
用Backgroundworker可用加异步委托方式来做
while(true)
{
if(tcl.Pending)
{
clientsocket = tcl.AcceptSocket();
clientservice = new Thread(new ParameterizedThreadStart(ServerChart));
clientservice.Start(clientsocket.RemoteEndPoint.ToString());
}
else
Thread.Sleep(200);
}
while(true)
{
if(tcl.Pending())
{
clientsocket = tcl.AcceptSocket();
clientservice = new Thread(new ParameterizedThreadStart(ServerChart));
clientservice.Start(clientsocket.RemoteEndPoint.ToString());
}
else
Thread.Sleep(200);
}
保证线程只开一次或者调用前把上个线程给杀死
如果是短连接,使用同步稍微好点,但无论如何,个人建议使用线程池来进行操作。
好多都不了解.各位有写过这方面知识的可以把连接贴出来
大家一起学习
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;class MyTcpListener
{
public static void Main()
{
TcpListener server=null;
try
{
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1"); server = new TcpListener(localAddr, port); server.Start(); Byte[] bytes = new Byte[256];
String data = null; while(true)
{
Console.Write("Waiting for a connection... "); TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!"); data = null; NetworkStream stream = client.GetStream(); int i; while((i = stream.Read(bytes, 0, bytes.Length))!=0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data); data = data.ToUpper(); byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); stream.Write(msg, 0, msg.Length);
Console.WriteLine("Sent: {0}", data);
}
client.Close();
}
}
catch(SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
server.Stop();
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
}
改为
server.BeginAcceptSocket这样只有连接接入的时候才执行之下的代码。
TcpListener tcl = new TcpListener(IPAddress.Parse(fconfig.Server),listenport);
tcl.Start();
Thread thread=new Thread(ThreadMehtod);
thread.start();
}public void ThreadMehtod()
{
while(true)
{
clientsocket = tcl.AcceptSocket();
clientservice = new Thread(new ParameterizedThreadStart(ServerChart));
clientservice.Start(clientsocket.RemoteEndPoint.ToString());
}
}