2012-05-01 5 views
14

У меня просто простой веб-сайт vb.net, которому нужно вызвать Sub, который выполняет очень длинную задачу, которая работает с синхронизацией некоторых каталогов в файловой системе (подробности не важный).Как сделать очень простой асинхронный вызов метода в vb.net

Когда я вызываю метод, он в конечном итоге истекает на веб-сайте, ожидая завершения подпрограммы. Однако, несмотря на то, что веб-сайт истекает, процедура в конечном итоге завершает свою задачу, и все каталоги заканчиваются так, как должны.

Я хочу просто предотвратить таймаут, поэтому я хотел бы просто вызвать 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 

ответ

20

Я бы не рекомендовал использовать класс Thread, если вам не требуется намного больше контроля над потоком, так как создание и отключение потоков является дорогостоящим. Вместо этого я бы рекомендовал использовать a ThreadPool thread. See this для хорошего чтения.

Вы можете выполнить свой метод на ThreadPool нить, как это:

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork) 

Вам также нужно изменить метод подписи ...

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

Наконец, также следует помнить, что необработанные исключения в других потоках будут убивать IIS. См. this article (старый, но по-прежнему актуальный, но не уверен в решениях, хотя я не использую ASP.NET).

+0

ЛЮБИТЕ ЭТО !!! Благодаря! – EdenMachine

+0

Это отлично подойдет для меня, я загружаю файл на веб-сервер.Подтвердите файл и отправьте его по электронной почте. Даже если пользователь закрывает веб-страницу/сайт/браузер, сообщение по-прежнему отправляется в пункт назначения. – htm11h

7

Вы могли бы сделать это с помощью простой нити:

Добавить:

Imports System.Threading 

И везде, где вы хотите его запустить:

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

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

+0

Прекрасно ответил так +1, но мне нравится идея ThreadPool лучше держать его простым и легким – EdenMachine

+0

@EdenMachine Я согласен, ThreadPool вероятно, лучший путь. –

0

Я также искал информацию о асинхронном программировании в VB. В дополнение к этой теме я также нашел следующее: начиная с Visual Studio 2012 и .Net Framework 4.5, VB было предоставлено два новых ключевых слова, чтобы сделать метод асинхронным в декларации без использования Thread или Threadpool. Новые ключевые слова: «Async» и «Await». Вы можете обратиться к следующим ссылкам, если вы хотите:

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

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

Смежные вопросы