问题标签 [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.

0 投票
1 回答
2955 浏览

timeout - .NET 取消流 BeginRead

在成功 HttpWebRequest 后,我​​无法找到取消/终止异步读取操作的方法。无法设置超时,ThreadPool.RegisterWaitForSingleObject 也不起作用。并且关闭底层套接字也不是一种选择,因为 HttpWebRequest/Reponse 都没有提供对它的访问。

编辑:

遗憾的是,Sunny 建议的这种方法仅适用于 HttpWebRequest.BeginGetResponse。对于您在 GetResponseStream() 之后获得的流,由于某种原因 RegisterWaitForSingleObject 不起作用 - 永远不会调用回调。

情况如下: 我有一个使用 HttpGetRequest 的应用程序。它是使用异步 httpwebrequest 的默认 MSDN 示例构建的。获得响应就像一种魅力。但在极少数情况下,我的 httpwebrequest 连接的服务器会忘记关闭套接字。所以我挂在 BeginRead 的无限阅读上。

在极少数情况下,其他服务器会忘记

0 投票
1 回答
133 浏览

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 用户提供的对象,用于将此特定异步读取请求与其他请求区分开来。
0 投票
2 回答
12018 浏览

asynchronous - BeginReceive / BeginRead 超时

我正在使用 NetworkStream 和 TcpClient 使用 BeginRead 异步接收数据。我需要对此操作应用超时,这样在指定的时间后读取将被中止。

据我所知,NetworkStream 或 TcpClient 不支持此功能-有一个 ReceiveTimeout 属性,但这似乎仅适用于同步等效项-“读取”。

甚至底层的 Socket 类似乎也不支持其 BeginReceive 方法中的超时。

我已经搜索过这个问题,我看到的唯一建议的解决方案是设置另一个后台线程来取消操作,如果它没有在超时期限内完成。这似乎是一个可怕的黑客攻击。肯定有更好的方法吗?

0 投票
2 回答
3184 浏览

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)


0 投票
3 回答
7871 浏览

c# - 停止 Stream.BeginRead()

我需要从我的虚拟 com 端口读取数据并检测消息“Dreq”。一旦我按下连接按钮,它就会连接到我的 COM8 端口并开始读取新线程。我还有一个断开按钮,我希望在其中关闭读取并断开与 COM8 端口的连接。但是,我在关闭 BeginRead 时遇到问题。

0 投票
0 回答
1198 浏览

c# - 是否可以中止/取消 FileStream.Beginread 异步读取操作

我想使用 USB 接口控制 STM32 微控制器。Jan Axelson ( http://www.lvr.com/hidpage.htm#MyExampleCode ) 创建了一些应用程序来展示 USB HID 类的用法,它现在是我的基本源。

为了检查我的设备是否有一些待处理的数据,我创建了一个调用Filestream.BeginRead()例程的线程。现在我想中止/取消这个请求,因为在退出那个线程后它仍然是打开/阻塞的(设置一个变量来取消线程循环)。所以我想知道如何取消这个BeginRead()电话。或者您对如何检查 USB 设备的连续发送数据有更好的了解吗?

0 投票
1 回答
411 浏览

c# - C# Winforms 和 NetworkStream.BeginRead(),如何根据网络事件打开新表单?

我在 NetworkStream.BeginRead() 和 WinForms 类之间从一个线程到另一个线程进行通信时遇到了一些严重的麻烦(当谈到线程和异步调用等主题时,我是一个真正的新手)。

特别是,我通过网络套接字连接到远程客户端,只是监听事件。当我收到一个时,我可以使用 NetworkStream 的 BeginRead() 和 EndRead() 方法正确地将它收集到一个字符串中,没有问题。然后我打算打开一个新表单(在表单的构造函数中使用字符串作为参数),以便可以向用户显示信息。实际上,网络事件将触发用户打开一个表单,以及信息但是,我经常遇到 CrossThreadMessagingExceptions,而且我对代理不够熟悉,我确信我做对了。有人能指出我正确的方向吗?

0 投票
1 回答
503 浏览

multithreading - BeginRead/EndRead 的 Windows CE 6.0 线程模型?

只是寻找有关线程如何用于 Windows CE 下套接字上的异步模式的确认或文档,特别是对于套接字的 BeginRead。我查看了 MSDN 的文档,但只能找到模糊的参考。我在这里搜索并找到了桌面线程模型的答案。附带说明一下,该程序是在 Compact Framework 中实现的。

因此,我的理解是:在调用 BeginXXX 的桌面上,回调可能会或可能不会由与调用 BeginXXX 的线程不同的线程调用。(取自我阅读并尝试过的 ThreadPool)

在 Windows CE 上,当调用 BeginXXX 时,回调由调用 BeginXXX 的线程处理。

这是准确的吗?如果是这样,我在哪里可以找到它的文档?STW 没有帮助,RTM 也没有。

0 投票
1 回答
161 浏览

c# - 异步解析非长度分隔的数据

我有一个联网服务器,我切换到使用同步 Begin.. 来处理短暂的请求,这是一个巨大的改进。对于长期存在的线程,创建了两个线程,并且随着客户端数量的增加,它开始成为一个问题。

通过这些连接传输的数据是 4 到 40 字节的消息。但是,它们不是长度分隔的,它们的长度可能取决于消息中的部分。可悲的是我不能改变协议。您可以将该协议视为一种快节奏的 telnet 终端协议。

我正在研究使用 Stream.BeginRead 读取和解析传入的消息/“行”,并遇到了两个担忧:

  1. 对于 10 字节的消息,调用 BeginRead 大约 3 次是否有效?
  2. 我如何有效地编写代码来做到这一点

这是一个例子。虽然消息本身没有长度前缀,但它的某些内容可能是。

同步方式(当前)

异步方法

异步示例不是我正在使用的,我已经编写了一些包装器来检查是否成功读取请求的字节数。这在编写和理解我可以获得的书面代码方面是否同样有效?

我的代码必须在 .NET 3.5 上运行,但未来 5 是和选项,所以我应该等待它然后进行异步编程吗?

这段代码将面向互联网,如果我使用同步读取,任何挂起的传入连接都会锁定线程池线程。

0 投票
2 回答
1616 浏览

c# - C#网络流分片数据

我的背景

我有一个 TCP 网络程序,它通过连接发送已序列化并编码为 base64 的大型对象。我编写了一个客户端库和一个服务器库,它们都使用NetworkStream's Begin/EndReadBegin/EndWrite. 这是我正在使用的(非常简化的版本)代码:

对于服务器:

然后客户端:

客户端库有一个回调方法,NetworkStream.BeginRead该方法触发将OnMessageFromServer数据作为字符串传递的事件MessageEventArgs

我的问题

但是,当通过 接收大量数据BeginRead/EndRead时,它似乎被分散在多条消息中。EG 假装这是一条很长的信息:

如果那真的是一条长消息,Client_OnMessageFromServer可能会被称为......说三遍“长消息”的碎片部分:

呜呜呜……深呼吸

将所有内容通过一个发送到Begin/EndWrite一个电话即可接收的最佳方式是Client_OnMessageFromServer什么?