Web窗体计时器刷新图像不起作用

时间:2014-08-05 21:34:47

标签: c# asp.net timer webforms

我有一个Web表单应用程序,它具有从IPcamera保存图像的功能。我添加了一个应该刷新图像的查看器页面,但它无法正常工作。我认为可能因为该函数在page_load中所以它只在页面首次加载时保存了新图像。我添加了一个Timer,这样它每运行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秒保存一次或者不刷新图像,我不知道哪个是问题。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

为什么使用服务器端事件?您已经拥有了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>

答案 1 :(得分:0)

您的应用程序中有一些内容会中断,第一个是:

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(...){}子句),并将结果返回给客户端。