asp.net C#ajax running' async'批量工作

时间:2012-12-15 03:17:40

标签: c# asp.net ajaxcontroltoolkit

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

我有什么:

  • 一页:有4个updatepanels

    1. 第一个UpdatePanel,包含(项目)gridview,用户显示选项(对此问题不重要)和执行数据库搜索的按钮,该数据库搜索返回显示到网格的项目列表。用户选择此网格上的项目...

    2. 第二个UpdatePanel包含一个下拉列表,其中包含从XML加载的可用任务列表。用户将选择一个任务,该任务在第二个更新面板中显示一堆可用选项/参数(也从XML文件加载)到另一个(参数)gridview。 Gridview在这里总是有一行数据。我在这里使用gridview是因为它更容易而不是创建动态控件(参数不同于每个任务)。用户可以在网格中输入参数值。用户单击“添加”按钮,该任务将添加到第3个更新面板中的另一个网格视图中。

    3. 3rd UpdatePanel包含一个(任务)gridview,其中包含用户添加的所有任务。还有一个按钮,可以批量运行所有任务。单击该按钮时,它将通过(任务)gridview查找要运行的待处理任务。对于每个挂起的任务,它调用一个适当处理任务的Web服务。 Web服务将任务结果与日志输出一起返回。

    4. 现在,第4个UpdatedPanel只包含一个显示从Web服务返回的日志输出的div。

我想进一步研究,不知道如何:

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

希望你理解我的问题。如果有人能够对如何处理这项任务提供一些指导和/或指示,我们非常感激

更多信息:

使用Framework 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将检索返回结果,写出(log)UpdatePanel。然后它将再次执行StartASyncJob(),查找要处理的下一个待处理记录。

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

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

我原以为让'异步'网络服务能够让用户一次做多件事,从而提供更好的用户体验。但似乎我错了和/或没有做对。

我没有尝试过使用QueueUserWorkItem的建议;但在此之前,请问它是否会产生与使用'PageAsyncTask'相同的效果。使用QueueUserWorkItem会产生“从同一页面线程产生”的相同效果吗?

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

1 个答案:

答案 0 :(得分:2)

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

  1. 如果您对服务器具有完全访问控制权,则可以创建一个单独的应用程序来处理任务;应用程序可以是Windows服务,页面和应用程序之间的通信可以是数据库或MSMMQ(通信主要是指任务列表及其状态 - 1.执行,2。执行3.完成)。

  2. 另一种解决方案是,如果您没有对服务器的完全访问控制,但它需要在线程之间实现一些通信。而不是我在第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
        }
    }
    

    每次(任务)更新面板刷新时,都应根据任务变量进行渲染。