/ / Jak wykonać bardzo proste wywołanie metody asynchronicznej w vb.net - vb.net, asynchronous

Jak wykonać bardzo proste asynchroniczne wywołanie metody w vb.net - vb.net, asynchroniczne

Mam tylko prostą witrynę vb.net, która musi wywołać Sub, która wykonuje bardzo długie zadanie, które działa z synchronizacją niektórych katalogów w systemie plików (szczegóły nie są ważne).

Kiedy wywołuję tę metodę, w końcu upływa limit czasuw witrynie, czekając na zakończenie procedury podrzędnej. Jednak mimo przekroczenia limitu czasu witryny, procedura w końcu kończy swoje zadanie i wszystkie katalogi zostają ustawione tak, jak powinny.

Chcę po prostu zapobiec przekroczeniu limitu czasu, więc chciałbym po prostu wywołać Sub asynchronicznie. Nie potrzebuję (ani nawet nie chcę) ani wywołania zwrotnego / potwierdzenia, że ​​został pomyślnie uruchomiony.

Jak więc mogę wywołać moją metodę asynchronicznie w witrynie internetowej przy użyciu VB.net?

Jeśli potrzebujesz kodu:

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

Odpowiedzi:

21 dla odpowiedzi № 1

Nie polecam używania rozszerzenia Thread class, chyba że potrzebujesz dużo większej kontroli nad wątkiem, ponieważ tworzenie i usuwanie wątków jest kosztowne. Zamiast tego polecam używanie wątek ThreadPool. Zobacz za dobrą lekturę.

Możesz wykonać swoją metodę na ThreadPool wątek taki jak ten:

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork)

Będziesz także musiał zmienić sygnaturę metody na ...

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

Na koniec należy również pamiętać, że nieobsłużone wyjątki w innych wątkach spowodują zabicie usług IIS. Widzieć Ten artykuł (stary, ale nadal aktualny; nie jestem pewien co do rozwiązań, ponieważ nie używam programu ASP.NET).


7 dla odpowiedzi nr 2

Możesz to zrobić za pomocą prostego wątku:

Dodaj :

 Imports System.Threading

I gdziekolwiek chcesz, aby działał:

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

Wezwanie do t.Start() wraca natychmiast i nowy wątek zostaje uruchomiony DoAsyncWork w tle, aż się zakończy. Musisz upewnić się, że wszystko w tym wywołaniu jest bezpieczne dla wątków, ale na pierwszy rzut oka wydaje się, że już tak jest.


0 dla odpowiedzi № 3

Szukałem też informacji ntProgramowanie asynchroniczne w VB. Oprócz tego wątku znalazłem również: począwszy od Visual Studio 2012 i .Net Framework 4.5, VB otrzymał dwa nowe słowa kluczowe, aby metoda była asynchroniczna bezpośrednio w deklaracji, bez użycia Thread lub Threadpool. Nowe słowa kluczowe to „Async” i „Await”. Jeśli chcesz, możesz skorzystać z poniższych linków:

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

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