c# - 从 ASP.NET 中的静态类更新控件的值

标签 c# asp.net

假设我有一个带有 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/

相关文章:

c# - 使用 lambda 的 Linq 子查询同一个表

c# - 如何创建一个在另一个类中触发的事件

c# - 如何使用 FTP 使用 Filezilla 发布 ASP.NET MVC 站点

mysql - 当用户选择的选项传输时,避免 MySql 中出现符号错误

c# - LINQ 生成的 IEnumerable 和原始列表之间有什么关系?

c# - 重新实例化线程

javascript - 协调 ASP.NET 脚本包和源映射

asp.net - ObjectCache 的 "Set"和 "Add"有什么区别?

c# - Asp.net 数据透视表

c# - 针对 ActiveDirectory 进行身份验证