假设我有一个带有 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 方法(不带任何参数)。
最佳答案
如果作业不是同步执行的(或者即使是同步执行的),我认为您可能需要考虑控制顺序。
在这种情况下,我建议采用类似于以下的结构:
1) 网页发出作业请求
2) 在某处创建并存储对作业的唯一引用(例如 GUID 或数据库表中的标识列)
3) job通过code-behind异步执行,然后将唯一标识返回给网页。
4) 网页在启动时启动一个 javascript 方法(例如使用 window.timeout),定期向 Web 服务器发出 ajax 查询以检查作业的状态。
5) 作业完成后,它会使用适当的信息更新全局引用。
6) 当 javascript 发现作业完成时,它会更新标签。
此过程允许用户在必要时继续其他工作,而不必担心由于回发时间长等原因导致的超时。
对于您的特定场景,您可以将 GUID 属性添加到 Job 类(这将被传递回客户端)。
当执行完成时,您可以将此 GUID 添加到 ajax 请求将检查的静态集合(即 Dictionary<Guid, string>
)(字符串值可以存储状态或完成信息)。
当 ajax 请求触发时,它会检查这个静态集合,当它找到它的工作时,将其删除并将值返回给调用者。
关于c# - 从 ASP.NET 中的静态类更新控件的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8773502/