/ / Как да направите много просто обаждане на асинхронен метод в 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. Виж това за добро четене.

Можете да изпълните метода си на a 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. Новите ключови думи са "Async" и "Очакай". Ако желаете, можете да се обърнете към следните връзки:

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

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