5

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

我有的:

  • 页:有4个更新面板

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

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

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

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

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

  • 如何执行“异步”批处理作业?我想要实现的是,当用户单击批处理运行按钮时,第三个(任务)更新面板及其所有控件被禁用,而批处理作业在“幕后”运行。根据任务的不同,每个任务最多可能需要 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 中搜索更多项目或从(任务)下拉列表中选择一个新任务,则在异步 Web 服务进程完成之前,该事件不会触发。完成后,下拉列表或搜索事件会触发,我从 Web 服务返回的日志详细信息不会更新。

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

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

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

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

4

1 回答 1

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
        }
    }
    

    每次刷新(任务)更新面板时,它都应该基于任务变量进行渲染。

于 2012-12-16T13:11:45.387 回答