【发布时间】:2018-01-26 06:50:22
【问题描述】:
我正在尝试每 16 毫秒(~60Hz)从驱动器上不断变化的特定文件(也在 ~60Hz)向浏览器发送一个图像。为此,我使用了 Response.BinaryWrite()。下面是我的代码(真的很简单)
protected void Page_Load(object sender, EventArgs e)
{
MainLoop();
}
private async Task MainLoop()
{
while (true)
{
//Update image to latest from server
Response.ContentType = "image/png";
Response.BinaryWrite(File.ReadAllBytes(Server.MapPath("/Frames/frame.png")));
Response.Flush();
await Task.Delay(16);
}
}
我的问题是它不刷新。我已经两次和三次检查文件确实在更改,并且我还尝试使用当前时间(以毫秒为单位)更新标签。我发现即使这样做,页面加载后它也根本不会更新。
如果我重新加载页面,它会同时显示新图像和新时间,因此问题似乎不在响应写作中。相反,就好像页面完全忽略了循环,只运行一次。
如果有人对尝试的替代方案有任何建议(请记住,由于其现场性质,视频不是一种选择),我很高兴听到他们的意见。也许我在这里遗漏了一些非常简单的东西,但我就是找不到!
谢谢!
【问题讨论】:
-
while 循环将无限期地每 16 毫秒运行一次,但不会向浏览器发送任何内容。服务器将继续这样做,请求将永远不会结束。您需要了解 Web 请求和响应的工作原理。
-
一张 60 Hz 图像 == 视频。
-
是的,但是它一次一帧地流式传输 - 从实时服务器到实时客户端。类似于屏幕共享工具。
标签: c# asp.net loops asynchronous async-await