Выделить процесс занимающий много времени в отдельный поток - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

При запуске приложения нужно обработать значительное количество данных. Например, исследовать содержимое папки с несколькими тысячами файлов. Эта операция занимает на среднем компьютере более 10 секунд. Если выполнение этой операции производить в Form_Load это затормозит загрузку приложения. Причём результаты выполнения этой длительной операции понадобятся не сразу после загрузки формы, а чуть позднее. А если в Form_Load вставить запуск второго потока в котором и производить эту операцию, не мешая при этом процессу запуска приложения? Если это возможно, то как это реализовать? Вот приблизительный пример для демонстрации описанных выше "тормозов":
Листинг программы
  1. Public Class Form1
  2. Dim count As Long
  3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4. LongProc()
  5. Label1.Text = count.ToString
  6. End Sub
  7. Sub LongProc()
  8. For i As Long = 0 To 4000000000
  9. count += i
  10. Next
  11. End Sub
  12. End Class
Вот нашёл в одной из тем (ответ Sklifosofsky):
Листинг программы
  1. Imports System.Threading
  2. Public Class Form1
  3. Private Delegate Sub _dlg(ByVal val As Integer)
  4. Private CallBack As New _dlg(AddressOf ShowResult)
  5. Dim count As Integer
  6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  7. Dim th As New MethodInvoker(AddressOf thExec) 'Создание экземпляра класса делегата
  8. th.BeginInvoke(Nothing, Nothing) 'Старт асинхронного потока
  9. End Sub
  10. Private Sub thExec()
  11. For i As Integer = 0 To 10000
  12. count += i
  13. Me.Invoke(CallBack, i) 'вклинивание передачи данных в основной поток
  14. Try
  15. Me.Invoke(CallBack, i) 'вклинивание передачи данных в основной поток
  16. Catch ex As Exception
  17. Exit Sub 'на случай завершения работы приложения до окончания цикла
  18. End Try
  19. Next
  20. End Sub 'Поток завершается автоматически, после завершения работы метода thExec.
  21. Sub ShowResult(ByVal val As Integer)
  22. Label1.Text = count.ToString
  23. End Sub
  24. End Class
Но почему-то цикл For совершается довольно медленно (если не использовать второй поток, цикл завершается мгновенно). И не могу догадаться как сделать, чтобы в метке появился конечный результат вычисления цикла, а не последовательный перебор значений.

Решение задачи: «Выделить процесс занимающий много времени в отдельный поток»

textual
Листинг программы
  1. Public Class Form1
  2.     Private Delegate Sub _dlg()
  3.     Private CallBack As New _dlg(AddressOf ShowResult)
  4.  
  5.  
  6.     Dim count As Long
  7.  
  8.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  9.         Dim th As New MethodInvoker(AddressOf LongProc)
  10.         th.BeginInvoke(Nothing, Nothing)
  11.     End Sub
  12.  
  13.  
  14.  
  15.     Sub LongProc()
  16.         For i As Long = 0 To 4000000000
  17.             count += i
  18.         Next
  19.  
  20.         Try
  21.             Me.Invoke(CallBack)
  22.         Catch ex As Exception
  23.             Exit Sub
  24.         End Try
  25.     End Sub
  26.  
  27.     Sub ShowResult()
  28.         Label1.Text = count.ToString
  29.     End Sub
  30.  
  31. End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы