14

我只有一个简单的 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
4

4 回答 4

23

Thread除非您需要对线程进行更多控制,否则我不建议使用该类,因为创建和拆除线程的成本很高。相反,我建议使用ThreadPool 线程请参阅此内容以供阅读。

ThreadPool您可以在这样的线程上执行您的方法:

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork)

您还需要将方法签名更改为...

Protected Sub DoAsyncWork(state As Object) 'even if you don't use the state object

最后,还要注意其他线程中未处理的异常会杀死 IIS。请参阅这篇文章(旧但仍然相关;不确定解决方案,因为我不重新使用 ASP.NET)。

于 2012-05-01T15:51:45.540 回答
7

你可以用一个简单的线程来做到这一点:

添加 :

 Imports System.Threading

以及您希望它运行的任何地方:

 Dim t As New Thread(New ThreadStart(AddressOf DoAsyncWork))
 t.Priority = Threading.ThreadPriority.Normal
 t.Start()

调用t.Start()立即返回,新线程DoAsyncWork在后台运行,直到完成。您必须确保该调用中的所有内容都是线程安全的,但乍一看,它通常似乎已经如此。

于 2012-05-01T13:51:50.060 回答
0

我还在寻找有关 VB 中的异步编程的信息。除了这个线程,我还发现了以下内容:从 Visual Studio 2012 和 .Net Framework 4.5 开始,VB 被赋予了两个新的关键字来在声明中使方法异步,而不使用 Thread 或 Threadpool。新关键字是“Async”和“Await”。如果您愿意,可以参考以下链接:

http://msdn.microsoft.com/library/hh191443%28vs.110%29.aspx

https://msdn.microsoft.com/en-us/library/hh191564%28v=vs.110%29.aspx

于 2016-12-04T22:07:51.087 回答
0

这是一个较旧的线程,但我想无论如何我都会添加它,因为我最近需要解决这个问题。如果要使用 ThreadPool 调用带参数的方法,可以修改@Timiz0r 的示例,如下所示:

System.Threading.ThreadPool.QueueUserWorkItem(Sub() MethodName( param1, param2, ...))
于 2019-06-11T17:21:16.750 回答