use*_*597 5 c# asp.net ajaxcontroltoolkit
我对asp.net和C#都很陌生,所以请耐心等待.如果以前曾经问过这个问题,我也很抱歉...如果有,请指导我到一个有帮助的页面.
是)我有的:
页面:有4个updatepanels
第一个UpdatePanel,包含(项目)gridview,用户显示选项(对此问题不重要)和执行数据库搜索的按钮,该数据库搜索返回显示到网格的项目列表.用户选择此网格上的项目...
2nd UpdatePanel包含一个下拉列表,其中包含从XML加载的可用任务列表.用户将选择一个任务,该任务在第二个更新面板中显示一堆可用选项/参数(也从XML文件加载)到另一个(参数)gridview.Gridview在这里总是有一行数据.我在这里使用gridview是因为它更容易而不是创建动态控件(参数不同于每个任务).用户可以在网格中输入参数值.用户单击"添加"按钮,该任务将添加到第3个更新面板中的另一个网格视图中.
3rd UpdatePanel包含一个(任务)gridview,其中包含用户添加的所有任务.还有一个按钮,可以批量运行所有任务.单击该按钮时,它将通过(任务)gridview查找要运行的待处理任务.对于每个挂起的任务,它调用一个适当处理任务的Web服务.Web服务将任务结果与日志输出一起返回.
4th UpdatedPanel现在只包含一个显示从Web服务返回的日志输出的div.
我想进一步研究,不知道如何:
希望你理解我的问题.如果有人能够对如何解决这项任务提供一些指导和/或指导,我们非常感激
更多信息:
使用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);
}
Run Code Online (Sandbox Code Playgroud)
BeginAsyncCommandTask将遍历网格,获取第一个待处理任务并调用Web服务.
然后,EndAsyncCommandTask将检索返回结果,写出(log)UpdatePanel.然后它将再次执行StartASyncJob(),查找要处理的下一个待处理记录.
只有在页面上不做任何其他操作时,所有这一切才有效.如果我(在异步进程运行时)在(项目)gridview中搜索更多项目或从(任务)下拉列表中选择新任务,则事件将不会触发,直到异步Web服务进程完成.当它完成后,下拉列表或搜索事件将触发,我的Web服务返回的日志详细信息不会更新.
我想'等待'是由'PageAsyncTask'从同一页面线程'生成'引起的?
我原以为让"异步"Web服务能够让用户一次做多件事,从而提供更好的用户体验.但似乎我错了和/或没有做对.
我还没有尝试过使用QueueUserWorkItem的建议; 但在此之前,请问是否会产生与使用'PageAsyncTask'相同的效果.使用QueueUserWorkItem会产生"从同一页面线程产生"的相同效果吗?
提前谢谢了.对不起,如果我没有很好地解释自己,如果您需要我发布我的代码,请告诉我.
有几种解决方案,但取决于您对服务器的控制程度。
如果您对服务器有完全访问控制,您可以创建一个单独的应用程序来处理任务;应用程序可以是 Windows 服务,页面和应用程序之间的通信可以是数据库或 MSMMQ(通信主要意味着任务列表及其状态 - 1. 待执行、2. 正在执行 3. 已完成) )。
另一个解决方案是如果您没有对服务器的完全访问控制,但它需要在线程之间实现一些通信。您可以拥有一个单独的线程,而不是使用我在第 1 点中描述的应用程序,该线程可以通过以下方式启动:
System.Threading.ThreadPool.QueueUserWorkItem(foo => LauchTaskRunner());
Run Code Online (Sandbox Code Playgroud)
假设您实现了一个名为 LaunchTaskRunner 的方法,该方法在循环中仅处理现有任务列表,上面的行会将其启动到一个单独的进程中。您可以通过一些静态变量(在页面中声明)与此方法(在单独的线程中运行)进行通信,例如:
public class YourPage : System.Web.UI.Page{
static IList<Task> tasks;
static void LauchTaskRunner(){
// here make use of tasks variable
}
}
Run Code Online (Sandbox Code Playgroud)
每次刷新(任务)更新面板时,它都应该根据任务变量进行渲染。
| 归档时间: |
|
| 查看次数: |
732 次 |
| 最近记录: |