- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码从 TCP 流中读取字节(我已经删除了错误检查):
/// <summary>Awaitable. Reads a certain amount of bytes from a network stream. Returns false
/// on error</summary>
async Task<bool> readBytes (NetworkStream stream, byte []buffer, int totalBytes)
{
int bytesRead = 0;
while (true)
{
var br = await stream.ReadAsync (buffer, bytesRead, totalBytes - bytesRead);
if (br == 0) return false; // closed stream
bytesRead += br;
if (bytesRead >= totalBytes) return true;
}
}
然后我在外部使用它来接收 4 个字节的数据长度和数据主体(伪代码,我已经删除了错误检查和分配,只是为了提供一个想法):
success = await readBytes(stream, header, 4);
success = await readBytes(stream, data, dataLength);
presentDataToApp(data, dataLength);
客户端/服务器必须几乎实时交互(这是一个客户端应用程序调整多个参数的游戏,例如灯光)。例如,客户端有一个 WinForms slider ,并将所有更改传输到服务器应用程序。移动该 slider 时,一秒钟内可能会有很多更新(根据我的日志,它发送数据的速度约为 100 次/秒)。
只要服务器(运行我粘贴的代码)通过 Visual Studio 运行,此代码就可以实时运行。但是,当我在没有 Visual Studio(或使用 Ctrl+F5)的情况下运行服务器应用程序时,通信开始严重滞后。
为了排除异步/等待问题,我克隆了通信类并通过线程运行它,删除了所有异步/等待函数。代码现在可以在 Visual Studio 和独立版本中实时运行(因此这是一个与 async/await 相关的问题)。
在这种情况下,为什么 async/await 滞后通信? (一秒钟内肯定有很多等待)。什么决定了在没有准备好数据的等待之后等待的时间量? (我认为这是定时器分辨率,但无论我如何执行服务器应用程序,它在我的系统上似乎都是 1 毫秒)。
最佳答案
The client/server must interact in almost realtime
在您同时控制客户端和服务器的任何情况下,我总是推荐 SignalR。与原始套接字相比,针对 SignalR 进行编程要容易得多。
This code works well and in realtime, as long as the server is run through Visual Studio. However, when I run the server app without Visual Studio (or using Ctrl+F5) the communication starts lagging badly.
这太奇怪了。 VS 使您的代码运行更快?对此我没有任何解释。
What does determine the amount of time waited after an await that doesn't have the data ready takes?
这里发生的几件事都可能产生影响。
第一个是await
捕获上下文并在该上下文中恢复。如果它是 UI 上下文,这尤其是一个问题。 At 100 updates per second, you're reaching the limit of what's practical .如果你的await
s 正在 UI 线程上恢复,您可以使用 ConfigureAwait(false)
避免这种“性能因千次 Papercut 而死亡” .如果真的是await
这是导致放缓的原因,请花时间查看 Zen of Async video .
第二个是有很多内存流失。 readBytes
至少每个数据包都需要一个单独的数组(假设您重用 header 数组),并且还有许多 Task
周围的实例。 如果分析表明问题是内存流失,那么consider using the new Memory<T>
-based socket APIs that avoid the byte arrays, as well as the new ValueTask<T>
-based APIs which avoid the Task
allocations when the data is already arrived .例如,.NET Core 2.1 Stream
原料药 ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken);
如果分析表明问题是内存流失,但您还没有使用 .NET Core 2.1,那么您可以使用 SocketAsyncEventArgs
APIs .
关于c# - 什么决定了 "await"花费的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56596440/
我有一个 forEach循环处理数组中的数据。在该循环中间的某个地方,我必须等待 DOM 元素的更改,获取该更改,处理它,然后才能继续处理数组。 我希望在控制台中看到这个: Preparing "aa
给定以下方法: public async Task DoSomethingAsync() { // do some work await OpenSomeFileAsync();
尝试在 .exports 中运行一个异步函数,获取 Promise,然后在下一个异步函数中使用结果,但由于某种原因,无论等待如何,第二个函数都会在第一个函数之前执行。 销售.js = const sq
谁能解释为什么 c# 5 中的异步函数需要至少有 1 个等待?我找不到明确的理由/解释。 所谓必需,是指当异步函数内部没有任何 await 调用时编译器会发出警告,但不会抛出编译错误。 来自 this
我想用 Mocha 测试异步代码. 我跟着这个教程testing-promises-with-mocha .最后,它说最好的方法是 async/await。 以下是我的代码,我打算将 setTimeo
这个问题在这里已经有了答案: How do yield and await implement flow of control in .NET? (5 个答案) How is resumption
我想在 trait 中编写异步函数,但是因为 async fn in traits 还不被支持,我试图找到等效的方法接口(interface)。这是我在 Rust nightly (2019-01-0
在 node.js 中,我有一个数据库事务,我想在 then 回调中调用一个 async 方法,但我收到错误消息 关键字“等待”已保留。 这是异步 saveImage 函数: const saveIm
我正在包装 AspNet.Identity。但有些事情让我对 TPL 感到困惑。 第一个例子: public virtual async Task RemovePasswordAsync(st
我有三个 showDialog 示例。我认为 _showAlert1 是正确的,但它使用 2 个函数来实现它。 _showAlert2 也有效,但我认为它不正确,因为我认为 showDialog 是异
我正在编写一个应该尽可能快地执行所有异步函数的函数,但是,它们中只有 5 个可以同时运行。 我想使用 Promise.race 来实现,所以实现不是最好的。问题是代码执行不会在 await 处停止。我
在 Scala 和其他编程语言中,可以使用 Futures 和 Await。 (在实际代码中,会使用例如 zip+map 而不是 Await) def b1() = Future { 1 } def
这个问题在这里已经有了答案: At the end of an async method, should I return or await? (2 个回答) 8年前关闭。 我做了一些阅读,并认为我已
我知道这是一个非常开放的问题,我深表歉意。 我可以看到 Await.ready返回 Awaitable.type而 Await.result返回 T但我仍然混淆他们。 两者有什么区别? 一个是阻塞的,
为什么等待者(GetAwaiter - 使类可等待)是结构而不是类。使用类有什么坏处吗? public struct ConfiguredTaskAwaiter : ICriticalNotifyCo
这个问题在这里已经有了答案: Why doesn't Scala's Future have a .get / get(maxDuration) method, forcing us to resor
async/await 链中的所有函数都必须使用 async/await 关键字吗? async function one() { return await fetch(.....); } asy
点击组件的按钮时将执行以下方法。 async onClickButton() { await this.shoppingCartService.add(this.selectedOffer);
它似乎被记录在案的唯一地方是 this issue thread和 the actual specification .但是,删除的原因并没有在我能找到的任何地方发布。 新的推荐方式似乎是await
为什么使用 await 需要将其外部函数声明为 async? 例如,为什么这个 mongoose 语句需要它所在的函数来返回一个 promise? async function middleware(
我是一名优秀的程序员,十分优秀!