问题标签 [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 回答
1805 浏览

c# - C# TcpClient 丢包

当我真正对我的网络代码进行压力测试时,我遇到了一些问题。基本上,一旦设置了套接字,它就会调用:

然后下面是我的发送方法

但是,是的,当我对系统进行压力测试时(比如 500 个左右的客户端同时发送大量消息),我注意到每 400 万个数据包中可能有 1 个数据包没有被接收。我不确定问题在于发送还是接收,这就是我包含这两种方法的原因。但是我会指出,如果我选择从客户端发送另一个数据包,它仍然可以正确发送和接收,所以它不仅仅是排队或其他东西。

谁能看到我缺少的东西?

0 投票
2 回答
4558 浏览

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。

0 投票
1 回答
2636 浏览

c# - 异步 TcpClient 没有及时读取所有数据

如果来自服务器的数据不多,或者如果有很多数据并且我取消注释该Thread.Sleep(500)行,则下面的代码可以工作。但是我不想使用该Thread.Sleep行,但如果我删除它,程序将在从服务器读取所有数据之前完成。似乎问题在于EndRead()在读取所有数据之前不会阻塞,这是可以理解的并且应该通过对 的递归调用来修复ReceiveCallback,但事实并非如此。

我有一个在 Linux 上使用 C/C++ 编写的工作客户端。我正在尝试使其与 c# 和 .Net 一起使用。我在 Linux 上使用 MonoDevelop 和 .Net 4.0。我感谢任何有关如何解决此问题的帮助。

0 投票
1 回答
7157 浏览

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;

代码:

错误的代码 - 使异步读取 - 同步

结束错误代码

0 投票
0 回答
114 浏览

vb.net - 自定义队列上的异步回调

我正在编写一个使用带有“BeginRead”的 TCP 套接字的类

正如我所看到的,每当读取数据时,每当读取数据时,回调函数的委托都会放置在线程池队列中(这是正确的吗?)。现在我想知道是否可以将此回调放在另一个队列中?

在我的程序中,我有 1 个工作队列,有自己的线程。所以我将每个事件都放在这个队列中,并且永远不会有竞争条件。现在我让委托在线程池上被调用,我立即在我自己的队列中放置一个新委托。如果可能的话,我想避免一步太多。

0 投票
2 回答
958 浏览

c# - 使用 NetworkStream.BeginRead() 获取 IOException

运行此代码时:

我收到以下 IO 异常BeginRead

无法从传输连接读取数据:无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满。

下面是 BeginRead 的回调方法:

有人可以说明引发此异常的原因吗?我每次都尝试在 while 循环开始时重新创建缓冲区,但是虽然这样做不会引发异常,但我不会从服务器接收消息。

我还尝试在 UpdateChatBoxAsync 结束时将 myBuffer 重置为空数组,这也不起作用。

任何帮助,将不胜感激。

0 投票
2 回答
875 浏览

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 处理得更好。我觉得多萝西被困在奥兹国了,我只想回到主线!

提前感谢您提供的任何帮助。

0 投票
0 回答
634 浏览

c# - C# TcpClient:发送意外停止

在 C#(一个 Unity 脚本)中,我有一个使用 TcpClient 发送和接收数据的客户端。客户端将每“帧”发送一个固定的数据字符串到服务器。服务器只是回显相同的字符串。这是测试和模拟的目的。

我使用异步方法 BeginWrite 和 BeginReceive。客户端通过以下方式发送数据:

我使用以下调用来接收数据:

现在,问题是在很短的时间(1秒左右)之后,客户端停止向服务器发送数据,即使调用发送方法的代码仍在被调用(通过日志输出和Wireshark验证) . 没有数据被发送出去,因此服务器不再接收数据。

以下代码用于初始化 TcpClient:

每一帧,以下代码用于开始发送字符串:

并使用以下方法关闭异步发送:

为了接收数据,我使用以下方法作为回调:

有人知道我在这里做错了什么吗?客户端停止发送的任何原因?我可以像这样异步发送和接收数据吗?

提前致谢!

0 投票
0 回答
1136 浏览

c# - 没有数据的命名管道异步读取调用

我正在编写一个 Windows 服务和一个单独的 GUI 程序,我希望它们与命名管道通信。Windows 服务是管道服务器,GUI 是客户端。

问题是,当我的客户端连接到 pipeServer 时,我的 BeginRead 异步回调一直在触发。客户端没有发送任何数据。

我不知道为什么 newMessage() 回调一直被调用,有人知道吗?

0 投票
1 回答
3146 浏览

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()异步打开文件!