问题标签 [beginread]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asynchronous - 使用异步回调的 TcpClient.BeginRead 方法冲突
我正在尝试创建一个接受多个客户端的 Tcp 套接字服务器。但是,在过去的几天里,我一直无法克服某些障碍。我相信我已经将问题隔离在 TcpClient.BeginRead( callbackMethod ) 方法中。
基本上,不同的客户端会激活此方法,但不会调用/触发回调,直到它们实际将数据发送到其传出流中。但是,我对通过流传入的字节执行的 encoding.ASCII.Getstring() 方法会输出不需要的“0/0/0/”,具体取决于 beginread 方法的启动顺序。为什么会这样?为什么?请帮忙。
有序的情况/情景
事件 1.) ClientOne Connects 然后触发 BeginRead 异步回调。(现在回调正在等待数据)
事件 2.) ClientTwo 连接,然后触发带有异步回调的 BeginRead。(现在回调正在等待数据)
事件 3.)如果 ClientOne 先发送消息,则数据肯定会得到服务,但是 Encoding.ASCII.GetString(3 arguments) 会为每个字节输出“0/”。我认为 ClientTwo 的 BeginRead 以某种方式干扰了 ClientOne 的 BeginRead。
事件 3。(不是 4))如果 ClientTwo 先发送消息,则使用 Encoding.ASCII.GetString(3 个参数)正确处理和解码/字符串化数据。
源代码
c# - Tcp客户端;网络流;异步读取;C#
请原谅我缺乏关于任务和异步的知识。
使用 TcpClient 类,我正在创建与可用服务器的连接:
辅助方法 HandleException(Exception ex) 和 HandleInboundData(byte[] buffer, int length) 将执行假定的任务。
与服务器的连接将是永久的,并且从服务器接收的数据的长度和频率将未知,其想法是抛出一个任务,仅在数据可用时接收和处理入站数据。
ReadClientAsync(TcpClient client) 明显失败,因为如果没有可用数据,ReadAsync 将始终返回 0 字节。
我应该如何使用 async / task 编写 ReadClientAsync 以防止繁忙循环的情况?我以前在这些情况下使用过 BeginRead / EndRead,效果很好。在这种特殊情况下,这会是解决方案吗?
谢谢,
c# - 在 C# 中读取整数的替代方法
我知道通过使用Convert.To
方法读取输入,但是除此之外还有什么方法可以读取。
c# - SerialPort BaseStream BeginRead 从不调用回调
我有一个我知道配置正确的 SerialPort 对象,因为我可以将数据发送到端口并且 DataReceived 事件已正确引发。但是,当我尝试如何更可靠地使用 SerialPort 类中提出的解决方案时,该解决方案建议使用对 BeginRead 的调用而不是 DataReceived 事件,我的异步回调从未被调用,并且对 BeginRead 的调用似乎“挂起”。
我尝试在打开端口后立即调用 KickoffRead,从 DataReceived 事件和一个单独的线程调用 - 这些都没有任何区别。我还尝试将缓冲区大小更改为 1,认为它正在等待完整的缓冲区 - 不走运。此外,当我尝试停止调试器时,它会挂起并且必须强制终止。
我正在使用虚拟串行端口(免费虚拟串行端口软件)进行测试,但是当我使用 DataReceived 而不是 BeginRead 时效果很好,所以我认为这是问题的根源。
c# - 无法访问已处置的对象:DataContext
我TCPClient
用来连接到设备并以字符串形式获取一些数据,然后我试图将数据保存到数据库并获取
“无法访问已处置的对象”错误。”
也许问题是因为我试图从异步回调函数保存到数据库?请看一下,这里有两个函数:第一个获取网络流,已经连接到设备并开始读取数据,第二个是回调:
c# - SerialPort.BaseStream.BeginRead 的正确用途是什么?
我的程序从串口获取不可靠数据时遇到问题,我相信https://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport#comments
本文有一些答案 - bytestoread 值似乎不稳定,当数据存在时并不总是调用回调,并且所有默认串行端口功能都不可靠,包括 datareceived 事件。正是我在这个程序中所经历的。事实上,在所有关于串行端口的微软文档中,都有关于功能失败的免责声明和说明。当这些问题出现在您的应用程序中时,它没有解决这些问题。
但是,当我尝试使用文章中提供的解决方案时,它似乎永远输出相同的第一个字节:“pppppppppppppppppppppppppppp”我可以确认收到的第一个字节实际上是“p”,但为什么它没有删除那个字节在阅读并继续之后,或收到任何字节之后,我不知道。据我所知,它与文章中提出的解决方案完全相同。这是代码:
当我在赋值后在“实际长度”上放置一个断点时,它显示为 1,这表明它在第一个字节之后永远不会读取。之后再也不会到达该分配和回调的断点,但应用程序继续发送垃圾邮件“p”。知道这里发生了什么吗?
c# - SslStream.BeginRead 在小块接收大数据时抛出 StackOverflowException
我正在研究通过 SSL 处理传入数据的异步 TCP 服务器。
我见过很多递归调用的例子SslStream.BeginRead
(MSDN 例子)。在这种情况下,堆栈会增长,如果传输的数据足够大并以小块的形式发送,这将StackOverflowException
在某个时候抛出。
在这个线程中:SslStream BeginReader throw StackOverFlowException有一个建议使用IAsyncResult.CompletedSynchronously
,但我不确定如何正确使用它。
使用 处理任何大小的数据传输的正确/可靠方法是什么SslStream
?
似乎 usingBeginRead
不是一种选择,最好在 a or中使用Read
/ 。ReadAsync
Task
Thread
StackOverflowException
如果我以小块传输 1GB 数据,这将抛出。