问题标签 [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.
timeout - .NET 取消流 BeginRead
在成功 HttpWebRequest 后,我无法找到取消/终止异步读取操作的方法。无法设置超时,ThreadPool.RegisterWaitForSingleObject 也不起作用。并且关闭底层套接字也不是一种选择,因为 HttpWebRequest/Reponse 都没有提供对它的访问。
编辑:
遗憾的是,Sunny 建议的这种方法仅适用于 HttpWebRequest.BeginGetResponse。对于您在 GetResponseStream() 之后获得的流,由于某种原因 RegisterWaitForSingleObject 不起作用 - 永远不会调用回调。
情况如下: 我有一个使用 HttpGetRequest 的应用程序。它是使用异步 httpwebrequest 的默认 MSDN 示例构建的。获得响应就像一种魅力。但在极少数情况下,我的 httpwebrequest 连接的服务器会忘记关闭套接字。所以我挂在 BeginRead 的无限阅读上。
在极少数情况下,其他服务器会忘记
c# - 使用 Stream.BeginRead 方法时如何知道数据的来源?
使用 Stream.BeginRead 方法时,您正在从流中读取数据到内存中,它是如何确定您从哪里读取数据的?
请参阅:http: //msdn.microsoft.com/en-us/library/system.io.stream.beginread.aspx
在参数列表中,我没有看到说明从何处读取数据的参数:
参数
- buffer 类型:System.Byte[] 要将数据读入的缓冲区。
- offset 类型:System.Int32 缓冲区中开始写入从流中读取的数据的字节偏移量
- count 类型:System.Int32 要读取的最大字节数。
- callback 类型:System.AsyncCallback 可选的异步回调,在读取完成时调用。
- state 类型:System.Object 用户提供的对象,用于将此特定异步读取请求与其他请求区分开来。
asynchronous - BeginReceive / BeginRead 超时
我正在使用 NetworkStream 和 TcpClient 使用 BeginRead 异步接收数据。我需要对此操作应用超时,这样在指定的时间后读取将被中止。
据我所知,NetworkStream 或 TcpClient 不支持此功能-有一个 ReceiveTimeout 属性,但这似乎仅适用于同步等效项-“读取”。
甚至底层的 Socket 类似乎也不支持其 BeginReceive 方法中的超时。
我已经搜索过这个问题,我看到的唯一建议的解决方案是设置另一个后台线程来取消操作,如果它没有在超时期限内完成。这似乎是一个可怕的黑客攻击。肯定有更好的方法吗?
c# - 在 AsyncCallback 函数之外停止异步流
我有一个 Stream 对象,我正在使用 BeginRead 开始(显然)读入缓冲区;读取完成后调用 AsyncCallback 函数。在这个函数中,我可以检查用户是否想要获得下一个“块”并再次启动 BeginRead 过程。
我遇到的问题是用户可能会在流仍在读取时选择取消(所以在调用 AsyncCallback 函数之前),那么如何取消流的读取?
只是为了进一步解释这个问题 - 如果我将 BackgroundWorker 与 Streams Read 方法或异步 BeginRead 方法一起使用,我似乎会得到相同的结果。在我可以检查流是否应该停止读取之前,用户可能会等待任何时间长度的 Read/BeginRead 方法完成。
编辑:下面的代码应该可以完成这项工作,我距离 C# 中任何体面的东西还有一百万英里,所以它很可能有几个错误,因为我怀疑它是否完美,尽管它确实展示了解决方案。
简而言之,CWorkManager 管理一定数量的线程(保存在 CWorkerDetail 类中)。每个 CWorkerDetail 都有一个状态,可以是 EWaiting 表示可以启动工作程序,EReading 表示工作程序正在从源读取,在此期间可以立即停止工作程序,EWriting 将读取的数据保存到磁盘 -这不能立即停止,并且必须在线程停止之前完成此过程。最后是 EAborting,如果工人应该尽快被中止,则由经理设置;现在,只有当工作人员处于无法中断的事情(例如写入磁盘)中间时才设置。
现在,实际上并没有进行任何读取或写入,因为这只会使主要解决方案复杂化(这基本上只是 StopWorker 函数检查 CWorker 的标志以查看它是否可以立即中止);因此,我们只是让线程休眠。
GUI 端相当简单,只有一个列表框(显示每个工作人员的状态)和一个停止和启动按钮。所有代码都在下面,希望这对某人有所帮助,但正如我所说,我对 C# 并不精通,所以请注意错误等...
CWorkManager.cs:
Form1.cs:
包含:
- 一个列表框 (ListBox_WorkerStatus)
- 一个按钮(Button_Start)
- 一个按钮 (Button_Stop)
c# - 停止 Stream.BeginRead()
我需要从我的虚拟 com 端口读取数据并检测消息“Dreq”。一旦我按下连接按钮,它就会连接到我的 COM8 端口并开始读取新线程。我还有一个断开按钮,我希望在其中关闭读取并断开与 COM8 端口的连接。但是,我在关闭 BeginRead 时遇到问题。
c# - 是否可以中止/取消 FileStream.Beginread 异步读取操作
我想使用 USB 接口控制 STM32 微控制器。Jan Axelson ( http://www.lvr.com/hidpage.htm#MyExampleCode ) 创建了一些应用程序来展示 USB HID 类的用法,它现在是我的基本源。
为了检查我的设备是否有一些待处理的数据,我创建了一个调用Filestream.BeginRead()
例程的线程。现在我想中止/取消这个请求,因为在退出那个线程后它仍然是打开/阻塞的(设置一个变量来取消线程循环)。所以我想知道如何取消这个BeginRead()
电话。或者您对如何检查 USB 设备的连续发送数据有更好的了解吗?
c# - C# Winforms 和 NetworkStream.BeginRead(),如何根据网络事件打开新表单?
我在 NetworkStream.BeginRead() 和 WinForms 类之间从一个线程到另一个线程进行通信时遇到了一些严重的麻烦(当谈到线程和异步调用等主题时,我是一个真正的新手)。
特别是,我通过网络套接字连接到远程客户端,只是监听事件。当我收到一个时,我可以使用 NetworkStream 的 BeginRead() 和 EndRead() 方法正确地将它收集到一个字符串中,没有问题。然后我打算打开一个新表单(在表单的构造函数中使用字符串作为参数),以便可以向用户显示信息。实际上,网络事件将触发用户打开一个表单,以及信息但是,我经常遇到 CrossThreadMessagingExceptions,而且我对代理不够熟悉,我确信我做对了。有人能指出我正确的方向吗?
multithreading - BeginRead/EndRead 的 Windows CE 6.0 线程模型?
只是寻找有关线程如何用于 Windows CE 下套接字上的异步模式的确认或文档,特别是对于套接字的 BeginRead。我查看了 MSDN 的文档,但只能找到模糊的参考。我在这里搜索并找到了桌面线程模型的答案。附带说明一下,该程序是在 Compact Framework 中实现的。
因此,我的理解是:在调用 BeginXXX 的桌面上,回调可能会或可能不会由与调用 BeginXXX 的线程不同的线程调用。(取自我阅读并尝试过的 ThreadPool)
在 Windows CE 上,当调用 BeginXXX 时,回调由调用 BeginXXX 的线程处理。
这是准确的吗?如果是这样,我在哪里可以找到它的文档?STW 没有帮助,RTM 也没有。
c# - 异步解析非长度分隔的数据
我有一个联网服务器,我切换到使用同步 Begin.. 来处理短暂的请求,这是一个巨大的改进。对于长期存在的线程,创建了两个线程,并且随着客户端数量的增加,它开始成为一个问题。
通过这些连接传输的数据是 4 到 40 字节的消息。但是,它们不是长度分隔的,它们的长度可能取决于消息中的部分。可悲的是我不能改变协议。您可以将该协议视为一种快节奏的 telnet 终端协议。
我正在研究使用 Stream.BeginRead 读取和解析传入的消息/“行”,并遇到了两个担忧:
- 对于 10 字节的消息,调用 BeginRead 大约 3 次是否有效?
- 我如何有效地编写代码来做到这一点
这是一个例子。虽然消息本身没有长度前缀,但它的某些内容可能是。
同步方式(当前)
异步方法
异步示例不是我正在使用的,我已经编写了一些包装器来检查是否成功读取请求的字节数。这在编写和理解我可以获得的书面代码方面是否同样有效?
我的代码必须在 .NET 3.5 上运行,但未来 5 是和选项,所以我应该等待它然后进行异步编程吗?
这段代码将面向互联网,如果我使用同步读取,任何挂起的传入连接都会锁定线程池线程。
c# - C#网络流分片数据
我的背景
我有一个 TCP 网络程序,它通过连接发送已序列化并编码为 base64 的大型对象。我编写了一个客户端库和一个服务器库,它们都使用NetworkStream's
Begin/EndRead
和Begin/EndWrite
. 这是我正在使用的(非常简化的版本)代码:
对于服务器:
然后客户端:
客户端库有一个回调方法,NetworkStream.BeginRead
该方法触发将OnMessageFromServer
数据作为字符串传递的事件MessageEventArgs
。
我的问题
但是,当通过 接收大量数据BeginRead/EndRead
时,它似乎被分散在多条消息中。EG 假装这是一条很长的信息:
如果那真的是一条长消息,Client_OnMessageFromServer
可能会被称为......说三遍“长消息”的碎片部分:
呜呜呜……深呼吸
将所有内容通过一个发送到Begin/EndWrite
一个电话即可接收的最佳方式是Client_OnMessageFromServer
什么?