【问题标题】:Web Forms Timer to refresh an image is not working用于刷新图像的 Web 表单计时器不起作用
【发布时间】:2014-08-05 21:34:46
【问题描述】:

我有一个 Web 表单应用程序,它具有保存来自 IP 摄像机的图像的功能。我添加了一个应该刷新图像的查看器页面,但它不起作用。我想可能是因为该函数在 page_load 中,所以它只在页面第一次加载时保存了新图像。我添加了一个计时器,以便它每 5 秒运行一次保存新图像的功能,但计时器似乎不起作用。代码如下:

namespace PlayVideo
{
public partial class Video : System.Web.UI.Page
{

    FileStream fs = File.Open(@"Location of file", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);



    protected void Page_Load(object sender, EventArgs e)
    {
        //This is where I originally had the function that saves the new image.
        //string saveTo = @"location to save new image";
        //FileStream writeStream = new FileStream(saveTo, FileMode.Create, FileAccess.ReadWrite);

        ReadWriteStream(fs, writeStream);

        Response.Clear();
        Response.TransmitFile("~/images/test.jpg");



    }

    // readStream is the stream you need to read
    // writeStream is the stream you want to write to
    private void ReadWriteStream(Stream readStream, Stream writeStream)
    {
        int Length = 256;
        Byte[] buffer = new Byte[Length];
        int bytesRead = readStream.Read(buffer, 0, Length);
        // write the required bytes
        while (bytesRead > 0)
        {
            writeStream.Write(buffer, 0, bytesRead);
            bytesRead = readStream.Read(buffer, 0, Length);
        }
        readStream.Close();
        writeStream.Close();
    }



    protected void Timer1_Tick(object sender, EventArgs e)
    {
        string saveTo = @"location to save new image";
        FileStream writeStream = File.Open(saveTo, FileMode.Create, FileAccess.ReadWrite);

        ReadWriteStream(fs, writeStream);

        //Response.Clear();
        //Response.TransmitFile("~/images/test.jpg");
    }

}

}

这是计时器的 .aspx 代码

        <asp:ScriptManager ID="ScriptManager1" runat="server">

    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel4" runat="server">
        <ContentTemplate>
            <asp:Timer ID="Timer1" runat="server" ontick="Timer1_Tick" Interval="5000" >
            </asp:Timer>
        </ContentTemplate>
    </asp:UpdatePanel>

这是查看器页面的代码:

<body>
<form id="form1" runat="server">
<div> 
<asp:Image ID="Image1" runat="server"  />   
  <img src="/video.aspx" id="the_image" alt="" />  


  <script type="text/javascript" language="javascript">

      function refreshImage() {
          objIMG = document.getElementById('the_image');
          objIMG.src = objIMG.src.substr(0, objIMG.src.indexOf('&nocache=')); +'&nocache=' + Math.random();
      }

      $(document).ready(function () {
          setInterval(refreshImage, 1000);
      })
</script>
</div>
</form>
</body>

它不是每 5 秒保存一次或者它没有刷新图像,我不知道是哪个问题。有人可以帮忙吗?

【问题讨论】:

    标签: c# asp.net timer webforms


    【解决方案1】:

    为什么要使用服务端事件?您已经拥有 javascript 和 setInterval() 方法。

    <script type="text/javascript" language="javascript">
    
          function refreshImage() {
              objIMG = document.getElementById('the_image');
              objIMG.src = objIMG.src.substr(0, objIMG.src.indexOf('&nocache=')); +'&nocache=' + Math.random();
          }
    
          $(document).ready(function () {
              setInterval(refreshImage, 1000);
          })
    
    
    </script>
    

    【讨论】:

    • 我在帖子中声明我添加了查看器页面,但刷新不起作用。
    • 它的哪一部分不起作用?你有没有通过javascript来看看为什么?
    • 显然我需要管理权限才能调试,而我在这台计算机上没有这些权限。是否有几行代码可以添加到 javascript 中以查看它是否正在通过该函数运行?像“num = num +1”并显示 num?我不知道 javascript 这就是我问的原因。
    • 您不应该需要管理员权限来调试 javascript。我会在setInterval 行以及refreshImage() 函数上设置一个断点,以查看1 - 它们被击中,2 - 你的刷新图像函数运行。请参阅此链接以调试 JS - msdn.microsoft.com/en-us/library/ie/gg699336(v=vs.85).aspx
    【解决方案2】:

    您的应用程序中会出现一些问题,首先是:

    FileStream fs = File.Open(@"C:\Users\xoswaldr\Desktop\C sharp stuff\SaveVideoToFilestream\SaveVideoToFilestream\bin\Debug\FS.avi", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
    

    通过将其放在.aspx 页面的顶部,您就是在告诉操作系统您要打开一个文件。这本身就很好。但是您从未真正告诉 Windows 关闭文件,并且流将在线程期间泄漏内存。此外,它将锁定文件,使其他进程无法访问它。解决这个问题的方法是告诉 .NET 你只想要这个文件很短的时间。这通常由以下人员完成:

    using(FileStream fs = File.Open(@"C:\Users\xoswaldr\Desktop\C sharp stuff\SaveVideoToFilestream\SaveVideoToFilestream\bin\Debug\FS.avi", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
    {
        // do stuff to fs in here
    } // at this } bracket, .NET will release the file
    

    using 关键字非常重要,那里有比我能写的更好的解释,但它通常用于 .NET 中与 IO 相关的任务。

    其次,您将在 .aspx 页面中实例化 Timer。这是从普通 WinForms 进入 ASP.NET 的程序员经常陷入的陷阱。为您的 .aspx 页面提供服务的类不是持久的,当您向该 url 发出请求时,您的类将被实例化,然后当请求完成时,它将被处理掉。因此,当您实例化 Timer 时,它将运行大约 50-200 毫秒来为您的网页提供服务。但是,当这一切都完成并发送回浏览器后,您的实例将消失,Timer 也会消失(希望如此,除非存在内存泄漏)。

    更重要的是,您的页面类中不需要Timer。在您的查看器页面中,您已经有一段类似的 javascript

    setInterval(refreshImage, 1000);
    

    这告诉浏览器向您的页面类发出另一个请求。所以你的类真正需要做的就是从文件中读取(不要忘记前面的using(...){} 子句),并将结果返回给客户端。

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 1970-01-01
      • 2014-02-16
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 2023-04-05
      相关资源
      最近更新 更多