c#-在哪个线程上调用SocketAsyncEventArgs Completed以及在何处处理消息
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-在哪个线程上调用SocketAsyncEventArgs Completed以及在何处处理消息,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2834字,纯文字阅读大概需要5分钟。
内容图文
![c#-在哪个线程上调用SocketAsyncEventArgs Completed以及在何处处理消息](/upload/InfoBanner/zyjiaocheng/668/339adf5a420b430fa92e58f19bb293d3.jpg)
我有一个使用SocketAsyncEventArgs异步接收UDP数据包的标准实现.我从文档和一些谷歌搜索中无法理解的是我是否应该真正处理回调本身内部的消息,例如我所指的完整实现中的this comment indicates,还是应该将处理工作卸载到其他线程,例如通过ConcurrentQueue或BlockingCollection.
我的担忧如下:
>如果直接在回调中进行处理,是否会由于临时线程池不足或其他一些实现细节而降低接收性能或引入随机延迟?
>由于处理上的细微延迟(与仅卸载到集合相比),由于缓冲区已满,是否可以丢弃更多软件包?
>从回调以与从网络实际到达的包开始的顺序不同的角度来看,是否可以对更多的包进行重新排序.
那么,使用SocketAsyncEventArgs处理消息的最佳实践或预期方法是什么,以确保最小的数据报丢失,没有对回调调用进行额外的重新排序以及没有其他的延迟?
还有一个相关的问题-ReceiveAsync是否可以保证任何顺序,还是至少尝试以与从网络接收包的顺序相同的顺序调用回调,或者我应该为此使用阻塞接收?目标用例是预订6-8个UDP通道,其中每个通道的顺序都非常重要.运行多个阻塞线程看起来比仅处理回调要复杂得多,但是如果只有这样的解决方案才能保证消息顺序,那么就不那么困难了.
解决方法:
what is the best practice or intended way of processing messages using SocketAsyncEventArgs to ensure minimum missed datagrams
坦白说,在某种程度上,这确实是一个见仁见智的问题,并且很大程度上取决于您的实际情况.通常,您的I / O完成例程应该很快.如果您的处理速度很快,那么可以在例程中执行此操作.如果没有,您应该做的工作尽可能少,即仅将数据移到可以在其他地方处理的队列中,然后从完成例程中返回.
请记住,这里的“快速”是相对的.您只需要比网络快,尽管网络速度不断提高,但是在现代CPU上并不是很难.网络层将代表您缓冲,因此,假设您的工作负载吞吐量大于网络上的吞吐量,则可以很好地完成完成例程中的工作.
但实际上,这取决于.通常无法说出哪个更好.每个特定方案都是不同的.
does ReceiveAsync guarantees any order at all or at least tries to call the callback in the same order that packages are received from a network, or I should use blocking receives for that?
阻止接收将无济于事.
异步方法都具有相同的特征:一次可以发出多个,并且它们将按照发出时的顺序完成.但是,您仍然需要跟踪发出读取操作的顺序.缓冲区将按照您分配给网络层的顺序进行填充,但是完成例程可能不按顺序执行,因为它们是在线程上执行的,并且线程调度程序不保证线程执行的顺序.仅仅因为一个线程在另一个线程之前可运行,并不意味着它实际上将在另一个线程之前获得下一个时间片.
但这实际上比这更糟:
The target use case is to subscribe to 6-8 UDP channels, within each of them the order is highly important.
如果顺序在您的方案中很重要,则需要在数据报中包括序列号,并确保在接收到这些数据报后使用顺序号将数据按正确的顺序放置.
UDP不保证排序.数据报可以以任何顺序接收,而与它们发送的顺序无关. UDP也完全不能保证传递.数据报可随时被丢弃. UDP也不能保证唯一性.给定的数据报可以多次传递.
如果在您的方案中可靠性和排序很重要,则可能应该使用TCP,而不是UDP.
如果您只关心订购,那么UDP可能仍然对您有用.在那种情况下,由于无论如何您都需要数据报中的序列号,因此确实简化了“多个并发读取操作”的情况,因为数据本身带有序列号,因此您无需单独跟踪(例如在与每个读取操作相关联的状态对象中).
内容总结
以上是互联网集市为您收集整理的c#-在哪个线程上调用SocketAsyncEventArgs Completed以及在何处处理消息全部内容,希望文章能够帮你解决c#-在哪个线程上调用SocketAsyncEventArgs Completed以及在何处处理消息所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。