c# – 可以在同一个Stream上启动多个异步读写 *** 作会破坏数据吗?

c# – 可以在同一个Stream上启动多个异步读写 *** 作会破坏数据吗?,第1张

概述我正在使用异步I / O,因为它不会阻塞调用线程并在幕后执行线程处理.如果我在同一个Stream上调用多个异步 *** 作(如BeginWrite()),我是否需要担心数据缓冲区内容是否混合在一起? 我们假设我想发送3个缓冲区: Buffer1: 1111111111Buffer2: 2222222222Buffer3: 3333333333 我不介意缓冲区是否以错误的顺序发送,所以 33333333 我正在使用异步I / O,因为它不会阻塞调用线程并在幕后执行线程处理.如果我在同一个Stream上调用多个异步 *** 作(如BeginWrite()),我是否需要担心数据缓冲区内容是否混合在一起?

我们假设我想发送3个缓冲区:

Buffer1: 1111111111Buffer2: 2222222222Buffer3: 3333333333

我不介意缓冲区是否以错误的顺序发送,所以

333333333311111111112222222222

没问题,但缓冲内容是否可能完全混合在一起?

122213121212122333313111223333

PS:我100%肯定有人已经以某种形式问过这个……

解决方法 这取决于Stream的实现.例如,套接字支持读取和写入的多个重叠请求,文件API也是如此.它们保证每个 *** 作的一致性(没有交错内容)以及 *** 作顺序:例如,对于套接字读取,接收的字节将被放置在发布的订单中发布的缓冲区中.如果不提供这些保证,则无法编写高性能网络应用程序,因为需要重叠发送,但高性能网络IO实际上需要重叠接收.许多文章都描述了这种行为,包括good ole’ Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports,并记录在MSDN Overlapped Input/Output上:

Both send and receive operations can
be overlapped. The receive functions
may be invoked multiple times to post
receive buffers in preparation for
incoming data,and the send functions
may be invoked multiple times to queue
up multiple buffers to be sent. Note
that while a serIEs of overlapped send
buffers will be sent in the order
supplIEd,the corresponding completion
indications may occur in a different
order. likewise,on the receiving
sIDe,buffers will be filled in the
order they are supplIEd,but
completion indications may occur in a
different order.

毫不奇怪,同样的保证会延续到世界的管理方面,例如. NetworkStream班:

Read and write operations can be
performed simultaneously on an
instance of the NetworkStream class
without the need for synchronization.
As long as there is one unique thread
for the write operations and one
unique thread for the read operations,
there will be no cross-interference
between read and write threads and no
synchronization is required.

话虽这么说,在Stream上随机抛出异步读写会很快导致混乱.应用程序需要仔细协调线程提交 *** 作的顺序,以使订单具有确定性.通常这意味着在保持同步锁的同时特别注意在(同步)列表中进行记帐以执行异步 *** 作调用.

最后要注意的是,所有这些异步API都在特别说明,确保完成顺序不能保证与提交顺序相匹配.

总结

以上是内存溢出为你收集整理的c# – 可以在同一个Stream上启动多个异步读/写 *** 作会破坏数据吗?全部内容,希望文章能够帮你解决c# – 可以在同一个Stream上启动多个异步读/写 *** 作会破坏数据吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1250024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存