14

ファイルシステム内のいくつかのディレクトリを同期する非常に長いタスクを実行する Sub を呼び出す必要がある単純な vb.net Web サイトがあります (詳細は重要ではありません)。

メソッドを呼び出すと、サブルーチンが完了するのを待っている Web サイトで最終的にタイムアウトになります。ただし、Web サイトがタイムアウトしても、ルーチンは最終的にそのタスクを完了し、すべてのディレクトリは正常に終了します。

タイムアウトを防ぎたいだけなので、Sub を非同期で呼び出したいだけです。正常に実行されたというコールバック/確認は必要ありません (または必要ありません)。

では、VB.net を使用して Web サイト内でメソッドを非同期的に呼び出すにはどうすればよいでしょうか?

コードが必要な場合:

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 に答える