正在编写服务器端程序,考虑到一个问题请大家指教!不知道是使用异步SOCKET,还是线程池,还是二者能和在一起用,(有点白,主要是对异步SOCKET理解不够)!详细问题请继续:外部对服务器的访问及数据交互总是随时随刻的,使用BeginSend/BeginReceive时总是会再创建一个线程用于EndSend/EndReceive,当有很多客户端同时和服务器进行数据交互时,那么服务器端必要会开启很多个线程,那么怎么对这些线程进行管理呢?然后就看到使用线程池对线程进程管理的相关文章,同时也了解到异步SOCKET好像是自己就有线程池进行管理,这里就期待高手帮我搞清楚了!⊙﹏⊙b汗!那么问题来了:
1、为了不把服务器累死,我想在进行网络异步通信时,是否需要对服务器线程进行管理?
2、如果异步通信有管理,那我们应该就是否不需要管理了?(这个问题有点白,主要是为了第三个问题)
3、如果没有,那么是否通过线程池进行管理,如何管理?线程池通过QueueUserWorkItem使线程去执行事件,而异步的BeginSend/BeginReceive好像直接开启了一个线程去运行回调函数!
1、为了不把服务器累死,我想在进行网络异步通信时,是否需要对服务器线程进行管理?
2、如果异步通信有管理,那我们应该就是否不需要管理了?(这个问题有点白,主要是为了第三个问题)
3、如果没有,那么是否通过线程池进行管理,如何管理?线程池通过QueueUserWorkItem使线程去执行事件,而异步的BeginSend/BeginReceive好像直接开启了一个线程去运行回调函数!
解决方案 »
- C#使用正则去掉a标记的问题
- DataGrid_Update更新日期列时,日期列都变成了旁边列的姓名,而数据库中的日期已更新了。怎么回事啊,帮帮忙!!!!
- 已知IP地址,如何知道是否已经和它连通,用C#怎样写?谢谢各位(在线等)
- 我也有同样的问题,进度条
- 关于C#连接SQL的问题
- 请教:虚方法在继承时如何处理不需要的部分最好?
- 一个C++函数转为C#
- 请问高手,VS.NET 平台问题,急
- CSDN可恶,又偷我的分!我再问!给分了!
- --sqlserver多个存储过程调用先后顺序的问题;
- 我用winform写了个程序,并用inno setup打包成安装包,但是现在安装后,无法关机,一定要退出程序才能关机
- 给ListBox.Items属性 赋值的问题。
可有人说应该同步+线程池,因为C#的SOCKET的异步通信是基于类似完成端口的,其内部已经进行过优化,因此不需要线程池!不知道这是否正确?
private void ReceiveCallback(IAsyncResult ar)
{
State_Object so = (State_Object)ar.AsyncState;
int byteread = 0;
Socket socket = so.workSocket;
try
{
byteread = socket.EndReceive(ar);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
if (byteread > 0)
{
int oldlength = tempbuffer.Length;
//扩充
Array.Resize(ref tempbuffer, (oldlength + byteread));
Buffer.BlockCopy(so.buffer, 0, tempbuffer, oldlength, byteread);
lock (x)
{
ReceiveCompose(tempbuffer);
}
}
else
{
Console.WriteLine("连接断开");
}
//开始继续接收
ReceiveInternal(socket);
}其中 ReceiveCompose(tempbuffer);
就表示处理数据落!我这里就有疑惑了,因为ReceiveCompose这个函数未来可能会进行很复杂的计算,如果还没计算完就又收到数据要求进行分析计算,会不会发生冲突!?
还是说每次接受到数据都会再一个线程运行ReceiveCallback函数中的代码!?
期待解答,谢谢!~
我个人理解的是,每次接受到数据然后就运行ReceiveCompose去处理,它们是一种并行处理的模式,应该不需要LOCK?对吗?
一个处理方法, 创建多个线程去执行这个方法, 这个
方法循环每个class, 先获取class中的object是否处在lock状态下, 如果不在这个状态, lock, 获取class中的socket类是否有需要处理的数据, 有的话处理. 然后结束lock, 继续循环下一个class这样就能保证多个线程不会同时操作socket
用的时候
lock(a)
{
读数据AAA
}用一个类来封装。a做为一个私有属性,各种数据操作方法中都锁这个a就行了。
这个我是看了哪个美国佬的书知道的,Network+Programming+for+Microsoft+Windows+2nd.CHM
里面说了C#是使用的类似于完成端口的
Socket异步可以指定使用完成端口3.5支持高性能异步通信,以Asy开头的系列函数
完整项目代码可以搜索一下SuperSocket。