我有一个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秒保存一次或者不刷新图像,我不知道哪个是问题。有人可以帮忙吗?
答案 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
。在您的查看器页面中,您已经有一个像
setInterval(refreshImage, 1000);
这告诉浏览器向您的页面类发出另一个请求。所以你的所有类都需要做,然后从文件中读取(不要忘记前面的using(...){}
子句),并将结果返回给客户端。