【问题标题】:Asp.Net asynchronous loop not firingAsp.Net 异步循环未触发
【发布时间】: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


【解决方案1】:

对问题的思考:

  1. 所以问题是页面不会每 16 毫秒呈现一次更新的结果。我们无法通过服务器端代码解决这个问题(例如,像你的 sn-p 这样的 c# 代码)。
  2. 我确定 while 循环仍在运行,但您始终需要手动刷新页面,因为这是 ASP.NET(具有刷新功能的传统 Web 应用程序)。这是一个可以支持我的堆栈溢出答案(如果您对我所说的内容持怀疑态度)refresh page after 3 seconds using c#

我不确定这里的最终目标是什么,但我假设您希望每 16 毫秒使用更新的 png 呈现您的页面。基本上从我上面的两点来看,不要试图通过服务器端更新图像; 相反,请通过客户端代码查看其他选项(例如 javascript)。

当然,我会尝试进一步评论您应该查看的确切位置,但我从未真正处理过每 16 毫秒更新一次图像!

我只是提供一些可以产生一些想法的链接:

  1. Refresh an image in the browser every x milliseconds
  2. Change image in HTML page every few seconds
  3. http://www.labbookpages.co.uk/web/realtime.html

我希望这可以推动你前进!让我知道这是怎么回事,因为我很好奇你将如何做到这一点:)

【讨论】:

  • 谢谢,我已经研究过刷新页面,但不幸的是,每 16 毫秒刷新一次会导致浏览器出现关于重定向过多的错误。无论如何,谢谢!
【解决方案2】:

您不仅需要获取新图像,还需要确保浏览器不使用已兑现的图像。

所以,解决方案有四个步骤:

  1. 创建一个返回当前图像的控制器动作,但您的控制器动作需要带一个参数。该参数成为查询字符串参数。每次调用该方法时,参数值应该不同。这样,浏览器会认为 URL 是新的,不会使用缓存的图像。您的网址应该类似于 http://mysite/mycontroller/getimage?param=12345678927483817

  2. 创建一个 JavaScript 方法来更改图像的 SRC 属性,方法是将其指向新控制器操作的 URL。使用不断变化的查询参数。我建议以毫秒为单位使用当前日期时间。

  3. 页面加载后,在 JavaScript 中设置一个计时器来调用您在第 2 步中创建的函数。

  4. 吃饼干,因为饼干很好吃。

【讨论】:

  • 没关系,我刚刚看到您的刷新率需求。我的解决方案不会为您提供所需的性能。您应该使用流媒体内容而不是图像。
  • 哈哈,是的,这个方法我已经试过了。将转向流媒体或 WebRTC。两者看起来都非常有希望。无论如何,谢谢!
猜你喜欢
  • 2016-08-03
  • 2023-03-30
  • 2018-02-16
  • 1970-01-01
  • 2018-10-17
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多