问题标签 [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.
c# - C# TcpClient 丢包
当我真正对我的网络代码进行压力测试时,我遇到了一些问题。基本上,一旦设置了套接字,它就会调用:
然后下面是我的发送方法
但是,是的,当我对系统进行压力测试时(比如 500 个左右的客户端同时发送大量消息),我注意到每 400 万个数据包中可能有 1 个数据包没有被接收。我不确定问题在于发送还是接收,这就是我包含这两种方法的原因。但是我会指出,如果我选择从客户端发送另一个数据包,它仍然可以正确发送和接收,所以它不仅仅是排队或其他东西。
谁能看到我缺少的东西?
c# - FileOptions.Asynchronous 导致 FileStream.BeginRead 阻塞
为什么使用 FileOptions.Asynchronous 创建 FileStream 会导致 FileStream.BeginRead 阻塞调用线程?
这是代码片段:
当使用 JetBrains dotPeek 挖掘 MSFT FileStream 代码时,他们的代码中似乎存在错误:
BeginRead 方法实际上似乎是通过调度任务来进行异步读取,但 BeginReadAsync 方法实际上最终会执行同步读取。所以他们的方法命名是倒退的,调用哪个方法的逻辑是错误的。如果 this._isAsync == true,则应该调用 BeginRead。
因此,似乎要让 FileStream.BeginRead 立即返回(异步安排读取),您实际上必须将 cosntructor 中的 useAsync 参数设置为 false。
c# - 异步 TcpClient 没有及时读取所有数据
如果来自服务器的数据不多,或者如果有很多数据并且我取消注释该Thread.Sleep(500)
行,则下面的代码可以工作。但是我不想使用该Thread.Sleep
行,但如果我删除它,程序将在从服务器读取所有数据之前完成。似乎问题在于EndRead()
在读取所有数据之前不会阻塞,这是可以理解的并且应该通过对 的递归调用来修复ReceiveCallback
,但事实并非如此。
我有一个在 Linux 上使用 C/C++ 编写的工作客户端。我正在尝试使其与 c# 和 .Net 一起使用。我在 Linux 上使用 MonoDevelop 和 .Net 4.0。我感谢任何有关如何解决此问题的帮助。
c# - 如何使用 NetworkStream.BeginRead 读取所有请求的数据?
有一个异步服务器的代码。客户端发送 Header - Data Block + Data Block 的大小。
服务器首先异步读取 Header,然后读取 Data Block。
我需要在读取数据块后运行 BeginRead for Header 读取部分,以使线程异步。
问题:
当我得到 DataCallBack 时,排队:
int bytesRead = ns.EndRead(result);
我没有得到我要求读入的所有缓冲区
mc.Client.GetStream().BeginRead(mc.DataBuffer, 0, size, new AsyncCallback(DataCallBack), mc);
如果客户端发送 1MB 的数据,我可以获得不同数量的“bytesRead”。
问题:
如何强制“BeginRead”从连接中读取所有数据。它应该导致新的 Header - Data 循环。
MyClient - 简单地包装 TcpClient;
代码:
错误的代码 - 使异步读取 - 同步
结束错误代码
vb.net - 自定义队列上的异步回调
我正在编写一个使用带有“BeginRead”的 TCP 套接字的类
正如我所看到的,每当读取数据时,每当读取数据时,回调函数的委托都会放置在线程池队列中(这是正确的吗?)。现在我想知道是否可以将此回调放在另一个队列中?
在我的程序中,我有 1 个工作队列,有自己的线程。所以我将每个事件都放在这个队列中,并且永远不会有竞争条件。现在我让委托在线程池上被调用,我立即在我自己的队列中放置一个新委托。如果可能的话,我想避免一步太多。
c# - 使用 NetworkStream.BeginRead() 获取 IOException
运行此代码时:
我收到以下 IO 异常BeginRead
:
无法从传输连接读取数据:无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满。
下面是 BeginRead 的回调方法:
有人可以说明引发此异常的原因吗?我每次都尝试在 while 循环开始时重新创建缓冲区,但是虽然这样做不会引发异常,但我不会从服务器接收消息。
我还尝试在 UpdateChatBoxAsync 结束时将 myBuffer 重置为空数组,这也不起作用。
任何帮助,将不胜感激。
vb.net - 是否可以从工作线程切换到主(UI)线程?
如果我的问题太啰嗦,我提前道歉。我查看了“如何使用另一个类的线程接收到的消息来更新 GUI 中的数据?”这个问题。它非常接近我想要做的,但答案不够详细,无法提供帮助。
我已将 VB6 应用程序转换为 VB.NET (VS2013)。该应用程序的主要功能是将查询发送到 Linux 服务器并在调用表单上显示结果。由于 WinSock 控件不再存在,我创建了一个类来处理与 TcpClient 类关联的函数。我可以成功连接到服务器并发送和接收数据。
问题是我有多个表单使用此类将查询消息发送到服务器。服务器以要在调用表单上显示的数据进行响应。当我尝试更新窗体上的控件时,我收到错误消息“跨线程操作无效:控件 x 从创建它的线程以外的线程访问”。我知道我应该使用 Control.InvokeRequired 和 Control.Invoke 来更新 Main/UI 线程上的控件,但我在 VB 中找不到一个好的、完整的示例。此外,我有超过 50 个表单,每个表单上都有各种控件,我真的不想为每个控件编写委托处理程序。我还应该提到线程和委托的概念对我来说是非常新的。在过去的一两周里,我一直在阅读我能找到的关于这个主题的所有内容,但我仍然被困住了!
有什么方法可以切换回主线程吗?如果没有,有没有办法我可以只使用一次 Control.Invoke 来覆盖多个控件?
在开始发送和接收数据之前,我尝试在连接后启动一个线程,但是一旦回调函数触发,netStream.BeginRead 就会启动它自己的线程。我也尝试使用 Read 而不是 BeginRead。如果响应中存在大量数据,则效果不佳,BeginRead 处理得更好。我觉得多萝西被困在奥兹国了,我只想回到主线!
提前感谢您提供的任何帮助。
c# - C# TcpClient:发送意外停止
在 C#(一个 Unity 脚本)中,我有一个使用 TcpClient 发送和接收数据的客户端。客户端将每“帧”发送一个固定的数据字符串到服务器。服务器只是回显相同的字符串。这是测试和模拟的目的。
我使用异步方法 BeginWrite 和 BeginReceive。客户端通过以下方式发送数据:
我使用以下调用来接收数据:
现在,问题是在很短的时间(1秒左右)之后,客户端停止向服务器发送数据,即使调用发送方法的代码仍在被调用(通过日志输出和Wireshark验证) . 没有数据被发送出去,因此服务器不再接收数据。
以下代码用于初始化 TcpClient:
每一帧,以下代码用于开始发送字符串:
并使用以下方法关闭异步发送:
为了接收数据,我使用以下方法作为回调:
有人知道我在这里做错了什么吗?客户端停止发送的任何原因?我可以像这样异步发送和接收数据吗?
提前致谢!
c# - 没有数据的命名管道异步读取调用
我正在编写一个 Windows 服务和一个单独的 GUI 程序,我希望它们与命名管道通信。Windows 服务是管道服务器,GUI 是客户端。
问题是,当我的客户端连接到 pipeServer 时,我的 BeginRead 异步回调一直在触发。客户端没有发送任何数据。
我不知道为什么 newMessage() 回调一直被调用,有人知道吗?
c# - 使用 FileStream.ReadAsync() 时,我应该以异步模式打开文件吗?
为 a 执行异步 I/O 的旧 .Net 方法FileStream
是使用FileStream.BeginRead()
和FileStream.EndRead()
.
状态的 MSDN 文档FileStream.BeginRead()
:
FileStream 提供两种不同的操作模式:同步 I/O 和异步 I/O。虽然可以使用其中任何一种,但底层操作系统资源可能只允许以其中一种模式进行访问。
默认情况下,FileStream 同步打开操作系统句柄。在 Windows 中,这会减慢异步方法的速度。如果使用异步方法,请使用 FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean) 构造函数。
.Net 4.5x
为 a 执行异步 I/O 的方式是FileStream
使用Stream.ReadAsync()
.
MSDN 文档FileStream.ReadAsync()
直接链接到Stream.ReadAsync()
. 该文档没有提到任何需要以异步模式打开文件;实际上,文档中的示例代码显然没有这样做。
因此,我假设使用时File.ReadAsync()
无需以异步模式打开文件。
这个假设正确吗?
[编辑]
我刚刚发现了一篇关于使用 Async for File Access 的 MSDN 文章。
这说明:
本主题中的示例使用 FileStream 类,该类具有导致异步 I/O 在操作系统级别发生的选项。通过使用此选项,您可以避免在许多情况下阻塞 ThreadPool 线程。
要启用此选项,请在构造函数调用中指定 useAsync=true 或 options=FileOptions.Asynchronous 参数。
所以现在我在想我应该以异步模式打开文件......如果是这样,有点不幸的是文档中提供的示例代码没有ReadAsync()
异步打开文件!