ASP.NET在后台执行长时间运行的方法

时间:2011-07-25 22:31:40

标签: asp.net web-services asynchronous methods

我想要完成的任务:我想从asp.net页面的代码(从用户点击按钮)调用一个长期运行的业务逻辑方法,并使进程异步运行。该过程将一些业务对象作为参数。一旦过程开始,用户应显示一个屏幕,表明他们将通过电子邮件发送结果;这里重要的是用户不必等待该过程完成。做这个的最好方式是什么?该过程已经存在并且可以在我的项目中运行,但页面在运行时会挂起。

最初我考虑过将方法移动到Web服务。因为它需要一个广泛的参数列表,我要保持签名相同并传递Web服务业务对象,但我得到命名空间错误。特别是“参数类型MyBusinessLogic.MyObject不能分配给参数类型MyWebService.MyObject”,即使我的网站和Web服务引用了相同的DLL。我知道为什么会这样,但我需要解决这个问题。

解决方案的实际实施并不十分重要。如果有一些方法可以在ASP.NET中异步运行一个我不知道的方法调用,这将是非常棒的。如果没有发送和XML参数列表并将其解析为业务对象我唯一的Web服务选项?

3 个答案:

答案 0 :(得分:1)

我有同样的问题,所以我做的是我将处理调用移动到Pre_Render方法,当它处理它时,在前端调用(创建)js函数来更新进度。

Response.Write("fnUpdate('Processing 1 to 30 files')");
Response.Flush();

我需要更改处理逻辑,以便它使用委托来更新进度。

希望它有所帮助。

编辑: 不要忘记增加Script.Timeout

Server.ScriptTimeout = 3600;

答案 1 :(得分:1)

答案 2 :(得分:1)

我很确定我最终做的是接近Jeremy的方法。

我找到了这个网站:http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx,它解释了如何异步调用方法。总结一下:如果你定义一个代理并调用ProxyMethod.BeginInvoke(null,null),那么该方法将在没有回调的情况下运行,即fire and forget。这就是我真正想要的,所以这就是我要去的地方。我不知道是否有必要,但我采用了该方法本身并将其从我的代码隐藏转移到业务逻辑中,并使其成为一个静态方法。所以通过代码看起来像这样:

private delegate void AsyncReportGen(ReportParameterObject rpo);
protected void GenerateReport()
{
    //other code
    AsyncReportGen reportGen = ReportGenClass.GenerateReportStaticMethod;
    reportGen.BeginInvoke(rdo, null, null);
}

GenerateReport方法由按钮单击事件调用。 GenerateReportStaticMethod会在完成后附加报告的情况下触发电子邮件。 BeginInvoke调用的方法在其自己的线程中运行,因此页面可以完成加载并向用户显示他们将收到电子邮件的消息。然后,用户可以继续使用该站点或关闭其浏览器。