请教如何做出只触发一次的事件

superpig2k 2012-05-20 08:28:58
设计要求用url+参数触发服务器端一个sql server job. 同时还要在页面上显示job正在执行,请等候. job完事了页面显示结果.

我是这么搞的. 把触发job的代码写在一个timer控件里. 然后用一个隐藏的 Textlabel 里的数值控制是否执行timer里的内容. timer每10秒触发一次, 第一次触发把Textlabel值改成0. 以后检查这个Textlabel值如果是0就不再触发job了.

这么搞理论上job只会触发一次. 可实际情况是在一些情况下居然连续触发了两次job. 检查后发现问题应该就出在用textlabel的内容做判断触发的依据. 也就是说在第一次触发timer到第二次触发前的10秒内,textlabel的值没有更改.

对ajax的timer控件不熟悉, 谁能帮忙给看看代码, 到底问题出在什么地方.多谢了,分分献上.


default.aspx

<body style="border: 0 none white; background-color: #EEF3FB; color: #424242; width: 500px; margin: 3px;">
<form id="form1" runat="server">
<div style="width: 500px">
<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="900">

</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>


<asp:Label ID="LabelResult" runat="server"></asp:Label>
<asp:Image ID="ImageJobRunning" runat="server"
ImageUrl="~/Images/imgloading.gif" Visible="False" ImageAlign="Top" />
 <asp:Label ID="Label3" runat="server" Text="1" Visible="False"></asp:Label>
<asp:Label ID="LabelURL" runat="server" Visible="False"></asp:Label>
<br />
</ContentTemplate>

</asp:UpdatePanel>
<div>
<asp:Timer ID="Timer1" OnTick="Timer1_Tick" runat="server" Interval="10000">
</asp:Timer>

</div>
<asp:UpdatePanel ID="UpdatePanel2" UpdateMode="Conditional" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>



</div>


</form>
</body>

default.aspx.cs

namespace ImportCatchmentWebApp
{
public partial class _Default : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{

string catchmentName = Request.QueryString["CatchmentName"];

if (Convert.ToInt32(Label3.Text.ToString()) == 1)
{
if (catchmentName != null)
{
LabelResult.Text = "Job is Running, please wait for up to 10 minutes.";
ImageJobRunning.Visible = true;
}
else
LabelResult.Text = "Request failed,need parameter: \"Catchment Name\"";

}
else if (Convert.ToInt32(Label3.Text.ToString()) == 2)
{
{
string url = LabelURL.Text;
Response.Redirect(url, true);

}

}
}


protected void Timer1_Tick(object sender, EventArgs e)
{
int result=-1;
int loadID=0;
string errorString="";

if (Convert.ToInt32(Label3.Text.ToString()) == 1) //第一次执行时 textlabel是1
{
Label3.Text = "0"; //第一次执行把值改成0, 意图只执行一次控件里的内容



string userName = Request.ServerVariables["LOGON_USER"];
string catchmentName = Request.QueryString["CatchmentName"];

if (catchmentName != null)
{

ImportCatchmentWebApp icwApp = new ImportCatchmentWebApp();

result = icwApp.RunImportCatchment(catchmentName, userName); //执行sql server job
loadID = icwApp.GetLoadID();

if (result == 0)
{
LabelResult.Text = "Import successful, job finished. Please save the socio report when prompted.";

ImageJobRunning.Visible = false;
string url = icwApp.GetReportLink();
//If Catchment import is successful, redirect to
//the reporting service link
//Response.Redirect(url, true);

Label3.Text = "2";
LabelURL.Text = url;


}
else
{

errorString = icwApp.GetErrorMessage(result);

LabelResult.Text = "Trade Area import failed.<br>" +
"Please contact your System Administrator with the following error:<br>"+
"LoadID = "+loadID+"<br>"+
"Error Code = "+result+" - "+errorString;

ImageJobRunning.Visible = false;
}
}

}

}






}
}
...全文
250 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltcszk 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

之所以把触发 sql server job放在 timer里执行,是为了在执行时页面上要显示任务正在执行.所以至少要有一次page_load的postback, 把内容显示出来. nage sql server job要执行三分钟至少.
[/Quote]
再加一个变量,表示是否在执行job

job开始时,变量放入session里,执行完移除,下一次来请求先判断session里有没有变量
anzhiqiang_touzi 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
LZ在page_load事件中添加一个!IsPostBack判断来试试,判断页面是否第一次载入
还有LZ用ajax的定时去请求的话 我建议用jquery+ajax比较好控制 用setInterval来定时请求就可以了
[/Quote]
superpig2k 2012-05-21
  • 打赏
  • 举报
回复
多谢楼上各位,把用textlabel改成session, 设置在page_load 里判断在第一次加载时(!Ispostback )初始化session并设timeout 10分钟.

然后触发sql server job两次的问题解决了.

但悲剧的是又引入了新的问题. 发布app后如果debug是false,运行时会弹出错误, Sys.WebForms.PageRequestManagerErrorException an unknown error occured while processing the request on the server.The status code return from the server was 500.

然后网页就不会继续向下了.

查了一下说这个是asp.net的一个现有bug,但原因和解决办法没有看懂说得啥意思.

奇怪的是如果把webconfig里debug改成true, 运行就正常不跳出这个错误.

各位有招么,这到底是啥情况阿.....
yyl8781697 2012-05-20
  • 打赏
  • 举报
回复
LZ在page_load事件中添加一个!IsPostBack判断来试试,判断页面是否第一次载入
还有LZ用ajax的定时去请求的话 我建议用jquery+ajax比较好控制 用setInterval来定时请求就可以了
superpig2k 2012-05-20
  • 打赏
  • 举报
回复
之所以把触发 sql server job放在 timer里执行,是为了在执行时页面上要显示任务正在执行.所以至少要有一次page_load的postback, 把内容显示出来. nage sql server job要执行三分钟至少.

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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