c# - asp.net C# ajax 运行 'async' 批处理作业

标签 c# asp.net ajaxcontroltoolkit

我对 asp.net 和 C# 很陌生,所以请耐心等待。如果之前有人问过这个问题,我也很抱歉......如果是这样,请引导我到一个有帮助的页面。

我拥有的:

  • 一个页面:有 4 个更新面板
  • 第一个 UpdatePanel 包含一个(项目)网格 View 、用户显示选项(对这个问题不重要)和按钮,它执行数据库搜索,返回显示到网格的项目列表。用户在此网格上选择一个项目...
  • 第二个 UpdatePanel 包含一个下拉列表,其中包含从 XML 加载的可用任务列表。用户将选择一个任务,该任务将一系列可用选项/参数(也从 XML 文件加载)显示到第二个更新面板中的另一个(参数)gridview。这里的 Gridview 总会有一行数据。我在这里使用 gridview 是因为它比创建动态控件更容易(每个任务的参数不同)。用户可以在网格中输入参数值。用户单击“添加”按钮,该任务将添加到第三个更新面板中的另一个 gridview。
  • 第三个 UpdatePanel 包含一个(任务)gridview,其中包含用户添加的所有任务。还有一个按钮,可以批量运行所有任务。单击按钮时,它会通过(任务)gridview 寻找要运行的挂起任务。对于每个挂起的任务,它调用一个 Web 服务来适本地处理任务。 Web 服务将任务结果与日志输出一起返回。
  • 第 4 个 UpdatedPanel 现在只包含一个 div,用于显示从 Web 服务返回的日志输出。

  • 我想进一步研究但不知道如何是:
  • 如何执行“异步”批处理作业?我想要实现的是,当用户单击批处理运行按钮时,第三个(任务)更新面板及其所有控件将被禁用,而批处理作业在“幕后”运行。根据任务的不同,每个任务最多可能需要 5 秒。如果用户创建了 60 个任务,我认为这也会导致页面超时吗?
  • 在批处理作业运行时,用户可以进一步搜索 (item) UpdatePanel 中的其他项目,并使用 (parameter) updatepanel 向 (task) updatepanel 添加新任务。
  • (任务)UpdatePanel 将在作业运行时显示某种类型的“作业正在进行中...”覆盖。

  • 希望你明白我的问题。如果有人能够就如何处理此任务提供一些指导和/或指示,将不胜感激

    更多信息:

    使用框架 3.5

    使用 Asp.net C# + Ajax

    Web 服务是在 solaris 机器上的 gSoap

    提前谢谢了。

    对不起,我是个菜鸟,我试图回复你的帮助,但发现我可以输入的字符有限。我现在只更新我自己的评论。

    谢谢你的建议。抱歉回复晚了,前几天我一直在环顾四周,做了一些更改,使其与“PageAsyncTask”和“IAsyncResult”一起使用。我创建了一个将由页面调用的 Web 服务类。新的 Web 服务类将称为 gSoap Web 服务。我已经设法以某种方式“异步”运行它。

    我有一个按钮,它执行:
      protected void StartASyncJob()
      {
         PageAsyncTask task = new PageAsyncTask(
            new BeginEventHandler(BeginAsyncCommandTask),
            new EndEventHandler(EndAsyncCommandTask),
            new EndEventHandler(AsyncCommandTaskTimeOut), null);
    
         RegisterAsyncTask(task);
      }
    

    BeginAsyncCommandTask 将遍历网格,获取第一个挂起的任务并调用 Web 服务。

    EndAsyncCommandTask 然后将检索返回结果,写出(日志)UpdatePanel。然后它会再次执行 StartASyncJob() 寻找下一个待处理的记录。

    只有在页面上不做任何其他事情时,所有这些才有效。
    如果我(在异步进程运行时)在(项目)gridview 中搜索更多项目或从中选择一个新任务
    (task) 下拉列表,在异步 Web 服务进程完成之前不会触发该事件。当它完成时,下拉列表或搜索事件会触发,我从 Web 服务返回的日志详细信息不会更新。

    我猜“等待”是由“PageAsyncTask”从同一页面线程“生成”引起的?

    我原以为拥有“异步”网络服务将使用户能够一次做不止一件事,从而提供更好的用户体验。但似乎我错了和/或做得不对。

    我还没有尝试过你使用 QueueUserWorkItem 的建议;但在我这样做之前,我可以问一下它是否会产生与使用“PageAsyncTask”相同的效果。使用 QueueUserWorkItem 是否与“从同一页面线程生成”具有相同的效果?

    提前谢谢了。对不起,如果我没有很好地解释自己,如果你需要我发布我的代码,请告诉我。

    最佳答案

    有几种解决方案,但取决于您对服务器的控制程度。

  • 如果您拥有对服务器的完全访问控制权,您可以创建一个单独的应用程序来处理这些任务;应用程序可以是 Windows 服务,您的页面和应用程序之间的通信可以是数据库或 MSMMQ(通信主要是指任务列表及其状态 - 1. 待执行,2. 正在执行 3. 完成)。
  • 另一种解决方案是,如果您没有对服务器的完全访问控制,但它需要在线程之间实现一些通信。您可以拥有一个单独的线程,而不是我在第 1 点描述的应用程序,它可以通过以下方式启动:
    System.Threading.ThreadPool.QueueUserWorkItem(foo => LauchTaskRunner());
    

    假设您实现了一个名为 LaunchTaskRunner 的方法,它在循环中只处理现有任务列表,上面的行将启动它到一个单独的进程中。您可以通过一些静态变量(在页面中声明)与此方法(在单独的线程中运行)进行通信,例如:
    public class YourPage : System.Web.UI.Page{
        static IList<Task> tasks;
        static void LauchTaskRunner(){
        // here make use of tasks variable
        }
    }
    

    每次(任务)更新面板刷新时,它应该基于 呈现任务多变的。
  • 关于c# - asp.net C# ajax 运行 'async' 批处理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13888975/

    相关文章:

    c# - 查找具有最大值属性的元素的速度更快

    c# - PowerShell中的对象相等标准是什么?ServiceController如何定义Equals方法?

    c# - 如何在 C# 中的一个循环中重命名多个按钮

    c# - 如何使匿名类型的属性名称动态化?

    c# - 什么可以破坏一个 session 对象asp .net?

    c# - 格式化我的字符串

    c# - 检查 Web API 是否可用的好/正确方法是什么?

    AjaxControlToolkit v7.1213 依赖增加

    javascript - 回发问题后填充图像

    asp.net - 使用ModalPopupExtender无需设置TargetControlID?