/ / Como fazer uma chamada de método assíncrono muito simples em vb.net - vb.net, assíncrono

Como fazer uma chamada de método assíncrona muito simples em vb.net - vb.net, assíncrono

Eu só tenho um site vb.net simples que precisa chamar um Sub que executa uma tarefa muito longa que funciona com a sincronização de alguns diretórios no sistema de arquivos (os detalhes não são importantes).

Quando eu chamo o método, ele eventualmente atinge o tempo limiteno site, aguardando a conclusão da sub-rotina. No entanto, mesmo que o tempo limite do site se esgote, a rotina eventualmente conclui sua tarefa e todos os diretórios terminam como deveriam.

Eu quero apenas evitar o tempo limite, então eu gostaria de apenas chamar o Sub de forma assíncrona. Eu não preciso (ou mesmo quero) um retorno de chamada / confirmação de que ele foi executado com sucesso.

Então, como posso chamar meu método de forma assíncrona dentro de um site usando VB.net?

Se você precisar de algum 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

Respostas:

21 para resposta № 1

Eu não recomendaria usar o Thread classe a menos que você precise de muito mais controle sobre o encadeamento, pois criar e desmontar encadeamentos é caro. Em vez disso, eu recomendaria usar um tópico ThreadPool. Veja isso para uma boa leitura.

Você pode executar seu método em um ThreadPool tópico como este:

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork)

Você também precisará alterar a assinatura do seu método para ...

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

Por fim, esteja ciente de que exceções não tratadas em outros threads matarão o IIS. Ver Este artigo (antigo, mas ainda relevante; não tenho certeza sobre as soluções, já que eu não uso o ASP.NET reaslly).


7 para resposta № 2

Você poderia fazer isso com um simples tópico:

Adicionar :

 Imports System.Threading

E onde você quiser que ele seja executado:

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

A chamada para t.Start() retorna imediatamente e o novo thread é executado DoAsyncWork em segundo plano até que seja concluído. Você teria que se certificar de que tudo nessa chamada era thread-safe, mas à primeira vista parece que já está.


0 para resposta № 3

Eu também estava procurando informações sobreProgramação assíncrona em VB. Além desse thread, eu também encontrei o seguinte: começando com Visual Studio 2012 e .Net Framework 4.5, o VB recebeu duas novas palavras-chave para tornar um método assíncrono direto na declaração, sem usar Thread ou Threadpool. As novas palavras-chave são "Async" e "Await". Você pode consultar os seguintes links, se desejar:

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

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