/ / Як зробити дуже простий виклик асинхронного методу у vb.net - vb.net, асинхронний

Як зробити дуже простий виклик асинхронного методу в vb.net - vb.net, асинхронний

У мене просто простий веб-сайт 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

Відповіді:

21 для відповіді № 1

Я б не рекомендував використовувати 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).


7 для відповіді № 2

Ви можете зробити це за допомогою простої нитки:

Додати:

 Imports System.Threading

І де б ви не хотіли, щоб він запускався:

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

Заклик до t.Start() негайно повертається, і новий потік запускається DoAsyncWork у фоновому режимі, поки не завершиться. Вам потрібно було б переконатися, що все у цьому дзвінку було безпечним для потоків, але на перший погляд це, здається, вже так.


0 для відповіді № 3

Я також шукав інформацію проАсинхронне програмування в VB. На додаток до цього потоку я також виявив наступне: починаючи з Visual Studio 2012 та .Net Framework 4.5, VB отримали два нові ключові слова, щоб зробити метод асинхронним прямо в декларації, не використовуючи Thread або Threadpool. Нові ключові слова - "Асинхронізація" та "Чекаю". За бажанням ви можете звернутися до таких посилань:

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

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