C#套接字Async vs Mulithreading

Ale*_*lex 4 c# sockets multithreading asynchronous

我正在开展一个项目,我将从多个服务器(少于1000个)连续提取信息,并将大部分信息写入数据库.我把选择范围缩小到2:

编辑:这是一个客户端,因此我将定期生成连接和请求信息.

1 - 使用异步方法,创建N个套接字以进行轮询,确定是否将信息写入回调中的数据库并将有用信息放入缓冲区.然后使用计时器从缓冲区写入信息.

2 - 使用多线程方法,创建每个线程一个套接字的N个线程.有用信息的缓冲区将保留在主线程上,循环写入也将保留.

这两个选项实际上都使用多个线程,只有第二个选项似乎增加了手动创建每个线程的额外难度.它有什么优点吗?是否明智地使用计时器?

usr*_*usr 6

使用1000个连接异步IO通常是一个好主意,因为它在IO正在进行时不会阻塞线程.(它甚至不使用后台线程来等待.)这使得(1)成为更好的选择.

从问题中不清楚你需要一个计时器.也许是为了缓冲写入?这将是有效的,但它似乎与这个问题无关.

轮询在现代异步IO应用程序中没有位置.完成后,系统会调用您的回调(或完成您的IO Task).回调排队到线程池.这让你不用担心.它刚刚发生.

读取数据的代码应如下所示:

while (true) {
 var msg = await ReadMessageAsync(socket);
 if (msg == null) break;
 await WriteDataAsync(msg);
}
Run Code Online (Sandbox Code Playgroud)

非常简单.没有阻塞线程.没有回调.

  • @aevitas不,它没有,它运行的是OS DPC事件.请参阅Steepen Cleary关于这个确切主题的优秀博客文章:"[没有主题](http://blog.stephencleary.com/2013/11/there-is-no-thread.html)" (2认同)