Ale*_*lex 4 c# sockets multithreading asynchronous
我正在开展一个项目,我将从多个服务器(少于1000个)连续提取信息,并将大部分信息写入数据库.我把选择范围缩小到2:
编辑:这是一个客户端,因此我将定期生成连接和请求信息.
1 - 使用异步方法,创建N个套接字以进行轮询,确定是否将信息写入回调中的数据库并将有用信息放入缓冲区.然后使用计时器从缓冲区写入信息.
2 - 使用多线程方法,创建每个线程一个套接字的N个线程.有用信息的缓冲区将保留在主线程上,循环写入也将保留.
这两个选项实际上都使用多个线程,只有第二个选项似乎增加了手动创建每个线程的额外难度.它有什么优点吗?是否明智地使用计时器?
使用1000个连接异步IO通常是一个好主意,因为它在IO正在进行时不会阻塞线程.(它甚至不使用后台线程来等待.)这使得(1)成为更好的选择.
从问题中不清楚你需要一个计时器.也许是为了缓冲写入?这将是有效的,但它似乎与这个问题无关.
轮询在现代异步IO应用程序中没有位置.完成后,系统会调用您的回调(或完成您的IO Task).回调排队到线程池.这让你不用担心.它刚刚发生.
读取数据的代码应如下所示:
while (true) {
 var msg = await ReadMessageAsync(socket);
 if (msg == null) break;
 await WriteDataAsync(msg);
}
非常简单.没有阻塞线程.没有回调.