如何启动异步流程?

时间:2009-07-16 20:24:47

标签: asp.net process asynchronous

我有一个网页表单,一旦填写完需要开始漫长的过程。由于我不希望用户坐在那里等待它完成,我想启动任务,然后将用户带到另一页继续工作。

这样做是否会涉及使用异步过程,如果是这样,有人会举例说明如何执行此操作吗?

4 个答案:

答案 0 :(得分:1)

这取决于过程。它需要多么可靠?如果进程崩溃可以吗?崩溃后需要恢复吗?系统崩溃后?

如果您需要一些可靠性,请在Windows服务中托管此长时间运行的任务。使用WCF传递请求,在Web应用程序和Windows服务之间进行通信。您甚至可以使用MSMQ连接来确保请求不会丢失,并且服务可以一次提取一个。

可以将服务配置为在Windows启动时启动,如果崩溃则重新启动。

答案 1 :(得分:1)

基本上你需要一个即时忘记的实现,你可以在不等待它完成的情况下触发异步操作。

在相关问题上查看以下answer

代码在C#.Net中,但vb.net应该类似。

编辑: Vb.net解决方案:

这是以异步方式触发Web方法的vb.net解决方案:

考虑您的网络方法如下:

Public Class Service1
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Sub LengthyProcess()
        'Perform the lengthy operation
        'Also note this doesn't return anything
        'Hence can be used safely in fire-n-forget way of asynchronous delegate
        System.Threading.Thread.Sleep(1000)
        System.IO.File.WriteAllText("C:\\MyFile.txt", "This is the content to write!", Encoding.UTF8)
        System.Threading.Thread.Sleep(1000)
    End Sub

End Class

现在,要异步调用Web方法,您可以根据.Net的版本执行以下任一操作:

.Net 3.5 (我不确定它是否适用于2.0)

确保在Page指令

中设置Async =“true”
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplication1._Default" Async="true" %>

在后面的代码中:

Partial Public Class _Default
    Inherits System.Web.UI.Page

    Dim webService As MyService.Service1

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        webService = New MyService.Service1()
        webService.LengthyProcessAsync()
    End Sub

End Class

.Net 2.0 / 1.0

无需设置Async =“true”

在代码隐藏中:

Partial Public Class _Default
    Inherits System.Web.UI.Page

    Public Delegate Sub MyDelegateCallBack()
    Dim webService As MyService.Service1

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        webService = New MyService.Service1()
        Dim del As MyDelegateCallBack
        del = New MyDelegateCallBack(AddressOf webService.LengthyProcess)
        del.BeginInvoke(Nothing, Nothing)
    End Sub
End Class

答案 2 :(得分:0)

查看BackgroundWorker组件: BackgroundWorker Component。这里的示例显示使用它来更新VB应用程序中的UI,但原则是通用的。

答案 3 :(得分:0)

我发现“重型”后台进程的最快,最轻量级的解决方案是在控制台应用程序中编写逻辑代码,并使用Windows调度程序定期运行应用程序或在需要时触发它。

我发现这比编写Windows服务要好得多,因为它需要更少的错误处理(即如果服务死了它需要恢复,而如果控制台应用程序死了,只需发送错误通知并等到下一次运行。

对于我编码的任何大型网站,我也会使用其中一个控制台应用来处理所有“非用户生成”事件以及重度事件。