加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使一个非常简单的异步方法调用在vb.net

发布时间:2020-12-17 00:09:31 所属栏目:大数据 来源:网络整理
导读:我只是一个简单的vb.net网站,需要调用一个Sub执行一个非常长的任务,可以同步文件系统中的一些目录(细节不重要). 当我调用该方法时,最终会在网站上等待子程序完成.然而,即使网站超时,例行程序最终完成任务,所有的目录都应该是最终的. 我想防止超时,所以我只想
我只是一个简单的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
我不建议使用Thread类,除非你需要更多的控制线程,因为创建和拆除线程是昂贵的.相反,我建议您使用 a ThreadPool thread. See this阅读.

您可以在ThreadPool线程上执行您的方法,如下所示:

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork)

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读