我写了WPF应用程序。什么是应用程序 - 只需从gps跟踪器收听数据。
问题是 - 我不知道如何处理100多个设备。我的意思是 - 现在我喜欢:
{
var serviceIP = System.Configuration.ConfigurationManager.AppSettings.Get("sericeIP");
var servicePort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings.Get("sericePort"));
var dispatcher = Dispatcher.CurrentDispatcher;
IPAddress localAddr = IPAddress.Parse(serviceIP);
_client = new TcpListener(localAddr, servicePort);
_client.Start();
new Thread(() =>
{
while (true)
{
TcpClient tcpClient = _client.AcceptTcpClient();
new Thread(() => AcceptClient(tcpClient, dispatcher)).Start();
}
});
}
private void AcceptClient(TcpClient client, Dispatcher dispatcher)
{
client.ReceiveTimeout = 13000;
while (client.Connected)
{
try
{
NetworkStream nwStream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
// My logic
}
catch (Exception ex)
{ }
}
}
对于1个设备可以 - 但是现在我认为100 - 500-1000设备将会是什么......... 1000线程会杀死机器 - 所以我不知道什么方式更适合听大数设备
答案 0 :(得分:1)
您需要使用异步编程。有几篇文章可以帮助你做到这一点。例如,MSDN获得example。使用async,您不需要自己分配线程。 .NET负责这一点。当OS等待IO操作时,所有线程都被释放。因此,更少数量的线程可以处理您的连接。
如果要从1000台设备接收数据,为什么要在客户端应用程序中执行此操作?当WPF应用程序关闭时,设备应该怎么做?
在Windows服务中接收信息并将信息存储在数据库中要好得多。通过这种方式,您还可以返回并分析所有收到的信息。