【发布时间】:2020-04-17 21:07:05
【问题描述】:
我正在 Windows 10 平台上用 C# 编写服务器/客户端套接字应用程序。 服务器端代码和 GUI 代码在同一个进程中运行。在服务器端,我正在尝试优化我的代码,因为我可以拥有 255 个套接字客户端连接。我遵循了微软的“同步服务器套接字示例”。我已经(从他们的例子中)移动了所有的逻辑 “public static void ReadCallback(IAsyncResult ar)”到:
Task.Run(() =>
{
ReadCallback(IAsyncResult ar);
});
.. ,希望“ReadCallback”会被不同的线程调用,因此尽快释放回调套接字线程。 这是否会产生问题,因为我现在调用了可能从不同线程调用的“socket.EndReceive(ar)”和“socket.BeginReceive(...)”? 代码仍然有效,但我不知道这是偶然还是我的设计。请对此发表评论。
【问题讨论】:
-
IAsyncResult来自 APM,Task.Run是 TPL,您不应该混合使用这两种方法。Task.Run会运行在线程池上,ReadCallback可能会运行在不同的线程池线程上 -
不,在添加 Task/async 之前,总是从线程池线程调用 End/BeginReceive()。使用 Task.Run 确实完全违背了使用 BeginReceive() 的目的,即仅在有有用的事情要做时才使用线程并运行代码。混合不是一个好主意。
-
感谢绅士们的回复。所以一般规则是单独使用 APM 线程池和 live TPL。我理解正确吗?
标签: c# visual-studio sockets