解决方案 »
- 多线程录音并进行MP3编码时报错:未处理的AccessViolationException:尝试读取或写入受保护的内存。者通常指示其他内存已损坏。
- 实现webbrowser的基本功能
- 用C#做的文件管理系统如何获取文件夹路径
- C#调用c++的dll的详细方法!
- 为什么两个本来是背景透明的图片框,重叠时就不透明了,如何解决?
- 小偷程序采集百度新闻的数据经常被封IP.请大家帮忙看看,万分感谢!
- 最后10分,在线等:原来datagrid.DataSource = dt.DefaultView;现在我想只绑定dt中的某两行,如何做到?
- C#接口转换问题,请教大侠
- 一个超级简单的小问题!!!!!!!!!!!!!1
- 水晶报表通过Adobe Reader 6.0打印,如果客户端没有,如何实现自动安装?
- 求存储过程 教程(C# 例)
- 二进制流把图片存进oracle数据库,blob类型.提示“ORA-01459: 变量字符串长度无效“
Managed I/O Completion Ports (IOCP)
在实验中保持Server运行,同时运行多次Client,你可以发现.Net并不一定需要多个线程来服务多个客户,在保持快速响应的同时,尽可能复用可用线程(可能最终一个就够了):// Server.cs
class Server
{
static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 4567);
listener.Start();
while (true)
{
Socket socket = listener.AcceptSocket();
StateObject so = new StateObject() { socket = socket };
so.socket.BeginReceive(so.buffer, so.offset, StateObject.BUFFER_SIZE - so.offset, SocketFlags.None, AsyncCallback, so);
}
}
static void AsyncCallback(IAsyncResult ar)
{
Console.WriteLine("AsyncCallBack in managed thread " + Thread.CurrentThread.ManagedThreadId);
StateObject so = ar.AsyncState as StateObject;
int read = 0;
try
{
read = so.socket.EndReceive(ar);
so.offset += read;
}
catch (SocketException se)
{
Console.WriteLine(se.Message);
} if (read == 0)
{
string msg = Encoding.UTF8.GetString(so.buffer, 0, so.offset);
Console.WriteLine(msg);
}
else
{
so.socket.BeginReceive(so.buffer, so.offset, StateObject.BUFFER_SIZE - so.offset, SocketFlags.None, AsyncCallback, so);
}
} public class StateObject
{
public Socket socket = null;
public const int BUFFER_SIZE = 64*1024;
public byte[] buffer = new byte[BUFFER_SIZE];
public int offset = 0;
}
}
// Client.cs
class Client
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(Sender, "Hello world ");
ThreadPool.QueueUserWorkItem(Sender, "nihao ");
ThreadPool.QueueUserWorkItem(Sender, "Bonjour "); Console.ReadLine();
} static void Sender(object state)
{
TcpClient tcp = new TcpClient("localhost", 4567);
Random random = new Random( state.GetHashCode() );
using (NetworkStream stream = tcp.GetStream())
{
for (int i = 0; i < 10; i++)
{
byte[] bytes = Encoding.UTF8.GetBytes( state as string);
stream.Write(bytes, 0, bytes.Length);
Thread.Sleep(random.Next(5 * 1000));
}
}
}
}
IO Completion