Mat*_*olf 8 c# sockets asynchronous tcp networkstream
我寻找满足以下要求的最佳实践:
我想知道我使用的框架BeginReceive和EndReceive实现的IAsyncResult回调是否是最先进的,因为我的目标是.Net 4.5.有没有更好的解决方案,例如使用NetworkStream或其他API选择?使用BeginReceive/EndReceive实现真正让我感到困惑的是,在EndReceive之后,我必须再次调用BeginReceive并再次注册回调.这对我来说听起来像是一个可怕的开销.为什么不能将新数据异步在任何时候,在同一时间增加了另一个环境中建立被然后通过引发的事件路由的完整信息?
使用IAsyncResult的论点通常是在处理线程处理时给出的,但是反对以下内容:使用NetworkStream并简单地读取和写入流.如上所述,只交换字符串消息,每个协议的每条消息都由换行符标记完成.单独的任务/线程将轮询流式读取器(基于网络流)ReadLine().它可能不会比那更简单,可以吗?
我基本上要问的是,以下代码如何才能真正实现异步?
public class SocketClient
{
private TcpClient client;
private StreamReader reader;
private StreamWriter writer;
public event Action<string> MessageCallback;
public SocketClient(string hostname, int port)
{
client = new TcpClient(hostname, port);
try
{
Stream stream = client.GetStream();
reader = new StreamReader(stream);
writer = new StreamWriter(stream);
writer.AutoFlush = true;
//Start Listener on port
StartListener();
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
}
public void StartListener()
{
Task task = Task.Factory.StartNew(() =>
{
while (true)
{
if (MessageCallback != null)
{
MessageCallback(reader.ReadLine());
}
//Thread.Sleep(200);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 13
目前没有现行的标准或惯例.您有多种选择,每种选择都有优点和缺点:
Tasks并使用async/ await.
async在"无限"循环中自己管理所有各种操作,并处理每个连接的状态管理.*Async方法包装成Tasks并使用async/ await.
对于你的情况(少于一百个套接字每秒几百条消息),我建议使用我的Nito.Async库.这是最容易的选择之一.
关于你的协议,你必须\n手工解析s并做自己的缓冲.(对于上述所有选择都是如此).
| 归档时间: |
|
| 查看次数: |
5136 次 |
| 最近记录: |