/ / Cómo hacer una llamada a un método asincrónico muy simple en vb.net - vb.net, asynchronous

Cómo hacer una llamada a un método asincrónico muy simple en vb.net - vb.net, asynchronous

Solo tengo un sitio web simple vb.net que necesita llamar a un Sub que realiza una tarea muy larga que funciona con la sincronización de algunos directorios en el sistema de archivos (los detalles no son importantes).

Cuando llamo al método, eventualmente se agotaen el sitio web esperando a que se complete la subrutina. Sin embargo, aunque el sitio web se agote, la rutina eventualmente completa su tarea y todos los directorios terminan como deberían.

Solo quiero evitar el tiempo de espera, así que me gustaría llamar al Sub de forma asincrónica. No necesito (ni siquiera quiero) una devolución de llamada / confirmación de que se ejecutó correctamente.

Entonces, ¿cómo puedo llamar a mi método de forma asincrónica dentro de un sitio web usando VB.net?

Si necesita algún código:

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

Respuestas

21 para la respuesta № 1

No recomendaría usar el Thread class a menos que necesite mucho más control sobre el hilo, ya que crear y eliminar hilos es caro. En su lugar, recomendaría usar un hilo ThreadPool. Mira esto para una buena lectura.

Puede ejecutar su método en un ThreadPool hilo como este:

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork)

También necesitará cambiar la firma de su método a ...

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

Por último, también tenga en cuenta que las excepciones no controladas en otros subprocesos matarán a IIS. Ver Este artículo (antiguo pero aún relevante; no estoy seguro acerca de las soluciones, ya que no uso ASP.NET).


7 para la respuesta № 2

Podrías hacer esto con un hilo simple:

Añadir:

 Imports System.Threading

Y donde quiera que corra:

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

La llamada a t.Start() regresa inmediatamente y el nuevo hilo se ejecuta DoAsyncWork en segundo plano hasta que se complete. Debería asegurarse de que todo en esa llamada sea seguro para subprocesos, pero a primera vista, en general, parece que ya lo es.


0 para la respuesta № 3

También estaba buscando información sobreProgramación asincrónica en VB. Además de este hilo, también encontré lo siguiente: comenzando con Visual Studio 2012 y .Net Framework 4.5, a VB se le dieron dos nuevas palabras clave para hacer un método asincrónico justo en la declaración, sin usar Thread o Threadpool. Las nuevas palabras clave son "Async" y "Await". Puede consultar los siguientes enlaces si lo desea:

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

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