C#页面定时刷新问题,B/S模式下

totsheng 2008-11-10 04:53:12
我是从webservice调用的一个定时方法

[WebMethod]
public int ReturnZT()
{
System.Timers.Timer time = new System.Timers.Timer();
time.Elapsed += new System.Timers.ElapsedEventHandler(time_Elapsed);
time.Interval = 5000;
time.Enabled = true;
return a;
}

void time_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (b % 2 == 0)
{
a = 0;
}
else
{
a = 1;
}
b++;
}

主要目的是就为了定时传值,值只有0和1。定的时长是5秒
我在页面的代码是

protected void Page_Load(object sender, EventArgs e)
{
localhost.WebService ws = new localhost.WebService();
int i = ws.ReturnZT();
Response.Write(i);
if (i == 0)
{
this.Image1.ImageUrl = "~/img/全关.jpg";
}
else
{
this.Image1.ImageUrl = "~/img/全开.jpg";
}
}

页面有个JavaScript的定时刷新

<script language="javascript">
function SX()
{
location.reload();
setTimeout("SX()",1000);
}
setTimeout("SX()",1000);
</script>

<body>
<form id="form1" runat="server">
<div onload="SX()">
<asp:Image ID="Image1" runat="server" ImageUrl="~/img/全关.jpg" />
</div>
</form>
</body>

以上是所有的代码,我的意思是webservice是定时5秒来传值,其中值只有0和1两种。然后在页面的C#调用这个webservice的方法,然后根据传来的值,进行判断,如果为0,显示全关图片,为1显示全开图片,1秒页面定时刷新。

可是我在测试的时候发现,图片的显示并没有按照5秒来切换,而是没有规律的切换,有时候是5秒切换,有时候是1秒切换。
我怀疑是不是在每1秒刷新的时候又重新调用了webservice里的方法,但是如果要是那样的话,应该每1秒刷新的图片都应该是一样的不会改变的了。
我想知道为什么会出现上面的情况,我所要实现的功能怎么实现?
谢谢!
...全文
1207 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
totsheng 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ysj52zqq 的回复:]
页面添加
<meta http-equiv="Refresh" content="刷新时间">
[/Quote]
咱先不用讨论刷新的问题,先讨论下误差的问题
ysj52zqq 2008-11-12
  • 打赏
  • 举报
回复
页面添加
<meta http-equiv="Refresh" content="刷新时间">
totsheng 2008-11-12
  • 打赏
  • 举报
回复
UP
totsheng 2008-11-12
  • 打赏
  • 举报
回复
现在就已经解决这样了,前台改用JavaScript调用webservice的方法了
下面是目前修改webservice的代码


[WebMethod]
static DateTime ntime = DateTime.Now;
public int ReturnZTByTime1(int span)
{
int ztnum;
TimeSpan ts = DateTime.Now - ntime;
if (ts.TotalSeconds % (span * 2) < span)
{
ztnum = 0;
}
else
{
ztnum = 1;
}
return ztnum;
}

前台JavaScript的代码

function ZT()
{
var parm2 = 3;//背景刷新频率
service.useService("http://localhost/WebServiceTest1103/WebService.asmx?wsdl","ReturnZTService");
service.ReturnZTService.callService(ZTcallback,"ReturnZTByTime1",parm2);
}
function ZTcallback(res){
if (!res.error)
{
if(res.value==0)
{
document.getElementById('divColor1').style.background="#FF0000";
}
else
{
document.getElementById('divColor1').style.background="#000000";
}
}
else
alert("ERR");
}
function SX()
{
ZT();
setTimeout("SX()",1000);
}

HTML的代码


<body>
<div id="service" style="behavior: url(webservice.htc)">
</div>
通过webservice的方法获得0、1值(JavaScript)
<div id="divColor1" style="border-right: black 1px solid; border-top: black 1px solid;
border-left: black 1px solid; width: 672px; border-bottom: black 1px solid; height: 245px">
<input style="width: 50px" onclick="SX()" type="button" value="开始">
</div>
</body>



结贴
totsheng 2008-11-12
  • 打赏
  • 举报
回复
现在就已经解决这样了,前台改用JavaScript调用webservice的方法了
下面是目前修改webservice的代码


[WebMethod]
static DateTime ntime = DateTime.Now;
public int ReturnZTByTime1(int span)
{
int ztnum;
TimeSpan ts = DateTime.Now - ntime;
if (ts.TotalSeconds % (span * 2) < span)
{
ztnum = 0;
}
else
{
ztnum = 1;
}
return ztnum;
}

前台JavaScript的代码

function ZT()
{
var parm2 = 3;//背景刷新频率
service.useService("http://localhost/WebServiceTest1103/WebService.asmx?wsdl","ReturnZTService");
service.ReturnZTService.callService(ZTcallback,"ReturnZTByTime1",parm2);
}
function ZTcallback(res){
if (!res.error)
{
if(res.value==0)
{
document.getElementById('divColor1').style.background="#FF0000";
}
else
{
document.getElementById('divColor1').style.background="#000000";
}
}
else
alert("ERR");
}
function SX()
{
ZT();
setTimeout("SX()",1000);
}

HTML的代码


<body>
<div id="service" style="behavior: url(webservice.htc)">
</div>
通过webservice的方法获得0、1值(JavaScript)
<div id="divColor1" style="border-right: black 1px solid; border-top: black 1px solid;
border-left: black 1px solid; width: 672px; border-bottom: black 1px solid; height: 245px">
<input style="width: 50px" onclick="SX()" type="button" value="开始">
</div>
</body>



结贴
jy251 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wf5360308 的回复:]
在 <head> </head>中添加:
<!-- 定时刷新页面10分钟一次-->
<meta http-equiv="Refresh" content="600">
[/Quote]

十分同意6楼观点,如果LZ只是要页面刷新的话,那么不妨试试纯HTML下的这种刷新方式!!也许比JS来的更方便点。
totsheng 2008-11-11
  • 打赏
  • 举报
回复
刚刚用1楼的方式实现了一下,误差率大大降低。
可是还是有误差,我认为主要是在毫秒方面的误差(因为我在代码中是取的整秒数,而忽略了毫秒数,但是在实际的运行过程中毫秒数是累加的,当毫秒数累加到图片刷新的时长数的时候就会发生误差),我感觉这个误差是避免不了的。
现在我的代码修改后如下
webservice

static DateTime ntime = DateTime.Now;
[WebMethod]
public int RetunZTByTime(DateTime ttime, int span)
{
int ztnum;
TimeSpan ts = ttime - ntime;
if (ts.Seconds % (span * 2) < span)
{
ztnum = 0;
}
else
{
ztnum = 1;
}
return ztnum;
}

页面服务器端(5秒刷新次图片)

localhost.WebService ws = new localhost.WebService();
int i = ws.RetunZTByTime(DateTime.Now, 5);
Response.Write(i);
if (i == 0)
{
this.Image1.ImageUrl = "~/img/全关.jpg";
}
else
{
this.Image1.ImageUrl = "~/img/全开.jpg";
}

页面还是1秒刷新一次
anlianganl 2008-11-11
  • 打赏
  • 举报
回复
顶下
OKILOVE 2008-11-11
  • 打赏
  • 举报
回复
你的页面每秒来刷新下,就要重新执行page_load,重新生成service实例,然后用ReturnZT方法生成新的timer来计时,从逻辑上我觉得应该不对。
这个设计到service运行的原理,是他自己是一个程序一样,所有变量,方法都能给一个启动就能时时运行,还是service仅仅是一个类,新实例化了就会有新的内存,变量等等。
从你的测试来看,貌似service紧紧是一个方法。1秒图片刷是因为你调用ReturnZT马上回有个返回值,而正好与当前的图片不同;每1秒调用returnZT,都有50%的概率来让图片刷新,所以时间就不确定了。
我觉得你应该用1楼的方法,用静态变量,循环迭代实现每5秒来变化回值。
冷月孤峰 2008-11-11
  • 打赏
  • 举报
回复
在<head></head>中添加:
<!-- 定时刷新页面10分钟一次-->
<meta http-equiv="Refresh" content="600">
totsheng 2008-11-11
  • 打赏
  • 举报
回复
UP。。
totsheng 2008-11-11
  • 打赏
  • 举报
回复
定时刷新是用HTML的还是JS的可以在后面讨论,先讨论下这个误差问题吧
我修改的代码上面已经发了
mjjzg 2008-11-11
  • 打赏
  • 举报
回复
<meta http-equiv="refresh" content="600">
在<head> </head>这样写确实是最简单可行的办法
liujw5168 2008-11-11
  • 打赏
  • 举报
回复
引用 6 楼 wf5360308 的回复:
在 <head> </head>中添加:
<!-- 定时刷新页面10分钟一次-->
<meta http-equiv="Refresh" content="600">

这样实现比较合理

totsheng 2008-11-10
  • 打赏
  • 举报
回复
因为要求,现在一定要用到webservice来实现。
Powerdolls 2008-11-10
  • 打赏
  • 举报
回复
如果只是定时刷新,通过前台脚本就可以实现了吧
totsheng 2008-11-10
  • 打赏
  • 举报
回复
请问1楼的意思是把webservice的方法改成用现在的时间减去上次的时间?
要从页面传递个参数给webservice?
如果上次刷新的时间和现在的时间相差5秒就换图片?
cpio 2008-11-10
  • 打赏
  • 举报
回复
不可能间隔1秒就换图片吧

因为无论如何刷新,图片地址都是WebService传来的,除非WebService有问题

再一看,的确是WebService有问题

它其实应该定义一个静态变量,用来存放上次的时间,再次刷新的时候要判断时间差,而不是在里面设置定时器。

另外,客户端脚本也浪费了些

<script language="javascript">
function SX()
{
location.reload();
setTimeout("SX()",1000); //这句没什么用
}
setTimeout("SX()",1000);
</script>

最好只刷新图片,不要整页刷新,这样不好


111,110

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧