假设我有一个带有Label控件的ASP.NET页面和以下执行预定作业的静态类:
public static class Job
{
// The Execute method is called by a scheduler and must therefore
// have this exact signature (i.e. it cannot take any paramters).
public static string Execute()
{
// Do work
}
}
当作业完成时,execute方法应该更新页面上Label控件的值。
我做了一些研究,唯一的方法似乎是使用HttpContext.Current.CurrentHandler。但是,这对我来说是不可取的,因为它可能会返回null。
由于Execute方法不能接受任何参数(请参阅注释),因此不能将Page实例作为参数传递。
还有其他方法可以从静态类更新控件吗?
注意:Execute方法必须是静态的,因为我正在创建一个EPiServer预定作业,这需要一个静态Execute方法(不带任何参数)。
答案 0 :(得分:1)
如果作业没有同步执行(或者即使是),我认为您可能需要考虑控制顺序。
我在这种情况下建议的结构类似于以下结构:
1)网页发出作业请求
2)在某处,创建并存储对作业的唯一引用(例如GUID或数据库表中的标识列)
3)通过代码隐藏异步执行作业,然后将唯一标识符返回到网页。
4)网页在启动时启动一个javascript方法(例如,使用window.timeout),定期向Web服务器发出ajax查询以检查作业的状态。
5)作业完成后,它会使用适当的信息更新全局参考。
6)当javascript看到作业完成时,它会更新标签。
此过程允许用户在必要时继续进行其他工作,而不必担心由于回传时间过长而导致的超时等。
对于您的特定方案,您可以向Job类添加GUID属性(将传递回客户端)。
当Execute完成后,您可以将此GUID添加到ajax请求将检查的静态集合(即Dictionary<Guid, string>
)(字符串值可以存储状态或完成信息)。
当ajax请求触发时,它将检查此静态集合,并在找到其作业时将其删除并将值返回给调用者。
答案 1 :(得分:0)
尝试使用全局变量(静态)或从Execute()方法中引发事件。
答案 2 :(得分:0)
您可以创建一个由Execute方法更新的静态属性,并将Label的Text属性绑定到aspx的OnInit方法中的static属性,Label.Text = Job.StaticProperty,如果需要有些动态响应你可以使用Ajax Timer Control来调用aspx页面上的方法,从aspx页面返回相同的静态值。
public static class Job
{
public static string UpdatedValue { get; private set; } // Or whatever the property is you wish to expose.
// The Execute method is called by a scheduler and must therefore
// have this exact signature (i.e. it cannot take any paramters).
public static string Execute()
{
// Do work
Job.UpdatedValue = "Execute Completed";
}
}
protected override OnInit(EventArgs e)
{
base.OnInit(e);
this.TextLabel.Text = Job.UpdatedValue;
}
// Using MSDN basic sample
protected void Timer1_Tick(object sender, EventArgs e)
{
this.TextLabel.Text = Job.UpdatedValue;
}