Ric*_*chC 14 vb.net asynchronous
我只是有一个简单的vb.net网站,需要调用一个执行很长任务的Sub,它可以同步文件系统中的某些目录(细节并不重要).
当我调用该方法时,它最终会在网站上超时等待子例程完成.但是,即使网站超时,例程最终也会完成它的任务,并且所有目录最终都应该如此.
我想阻止超时,所以我想只是异步调用Sub.我不需要(甚至不想)和回调/确认它成功运行.
那么,如何使用VB.net在网站内异步调用我的方法?
如果你需要一些代码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Call DoAsyncWork()
End Sub
Protected Sub DoAsyncWork()
Dim ID As String = ParentAccountID
Dim ParentDirectory As String = ConfigurationManager.AppSettings("AcctDataDirectory")
Dim account As New Account()
Dim accts As IEnumerable(Of Account) = account.GetAccounts(ID)
For Each f As String In My.Computer.FileSystem.GetFiles(ParentDirectory)
If f.EndsWith(".txt") Then
Dim LastSlashIndex As Integer = f.LastIndexOf("\")
Dim newFilePath As String = f.Insert(LastSlashIndex, "\Templates")
My.Computer.FileSystem.CopyFile(f, newFilePath)
End If
Next
For Each acct As Account In accts
If acct.ID <> ID Then
Dim ChildDirectory As String = ConfigurationManager.AppSettings("AcctDataDirectory") & acct.ID
If My.Computer.FileSystem.DirectoryExists(ChildDirectory) = False Then
IO.Directory.CreateDirectory(ChildDirectory)
End If
My.Computer.FileSystem.DeleteDirectory(ChildDirectory, FileIO.DeleteDirectoryOption.DeleteAllContents)
My.Computer.FileSystem.CopyDirectory(ParentDirectory, ChildDirectory, True)
Else
End If
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
Tim*_*z0r 23
我不建议使用Thread该类,除非你需要更多的控制线程,因为创建和拆除线程是昂贵的.相反,我建议使用ThreadPool线程.看到这个是为了一个好的阅读.
您可以在这样的ThreadPool线程上执行您的方法:
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork)
Run Code Online (Sandbox Code Playgroud)
您还需要将方法签名更改为...
Protected Sub DoAsyncWork(state As Object) 'even if you don't use the state object
Run Code Online (Sandbox Code Playgroud)
最后,还要注意其他线程中未处理的异常会导致IIS死亡.看到这篇文章(旧的,但仍然相关;不确定解决方案,因为我不会真正使用ASP.NET).
你可以用一个简单的线程做到这一点:
添加:
Imports System.Threading
Run Code Online (Sandbox Code Playgroud)
无论你想在哪里运行:
Dim t As New Thread(New ThreadStart(AddressOf DoAsyncWork))
t.Priority = Threading.ThreadPriority.Normal
t.Start()
Run Code Online (Sandbox Code Playgroud)
调用t.Start()立即返回,新线程DoAsyncWork在后台运行,直到完成.你必须确保该调用中的所有内容都是线程安全的,但乍一看它似乎已经是如此.