我有一个网页表单,一旦填写完需要开始漫长的过程。由于我不希望用户坐在那里等待它完成,我想启动任务,然后将用户带到另一页继续工作。
这样做是否会涉及使用异步过程,如果是这样,有人会举例说明如何执行此操作吗?
答案 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服务要好得多,因为它需要更少的错误处理(即如果服务死了它需要恢复,而如果控制台应用程序死了,只需发送错误通知并等到下一次运行。
对于我编码的任何大型网站,我也会使用其中一个控制台应用来处理所有“非用户生成”事件以及重度事件。