Выделить процесс занимающий много времени в отдельный поток - Visual Basic .NET
Формулировка задачи:
При запуске приложения нужно обработать значительное количество данных. Например, исследовать содержимое папки с несколькими тысячами файлов. Эта операция занимает на среднем компьютере более 10 секунд. Если выполнение этой операции производить в Form_Load это затормозит загрузку приложения. Причём результаты выполнения этой длительной операции понадобятся не сразу после загрузки формы, а чуть позднее. А если в Form_Load вставить запуск второго потока в котором и производить эту операцию, не мешая при этом процессу запуска приложения? Если это возможно, то как это реализовать?
Вот приблизительный пример для демонстрации описанных выше "тормозов":
Но почему-то цикл For совершается довольно медленно (если не использовать второй поток, цикл завершается мгновенно).
И не могу догадаться как сделать, чтобы в метке появился конечный результат вычисления цикла, а не последовательный перебор значений.
Листинг программы
- Public Class Form1
- Dim count As Long
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- LongProc()
- Label1.Text = count.ToString
- End Sub
- Sub LongProc()
- For i As Long = 0 To 4000000000
- count += i
- Next
- End Sub
- End Class
Вот нашёл в одной из тем (ответ Sklifosofsky):
Листинг программы
- Imports System.Threading
- Public Class Form1
- Private Delegate Sub _dlg(ByVal val As Integer)
- Private CallBack As New _dlg(AddressOf ShowResult)
- Dim count As Integer
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Dim th As New MethodInvoker(AddressOf thExec) 'Создание экземпляра класса делегата
- th.BeginInvoke(Nothing, Nothing) 'Старт асинхронного потока
- End Sub
- Private Sub thExec()
- For i As Integer = 0 To 10000
- count += i
- Me.Invoke(CallBack, i) 'вклинивание передачи данных в основной поток
- Try
- Me.Invoke(CallBack, i) 'вклинивание передачи данных в основной поток
- Catch ex As Exception
- Exit Sub 'на случай завершения работы приложения до окончания цикла
- End Try
- Next
- End Sub 'Поток завершается автоматически, после завершения работы метода thExec.
- Sub ShowResult(ByVal val As Integer)
- Label1.Text = count.ToString
- End Sub
- End Class
Решение задачи: «Выделить процесс занимающий много времени в отдельный поток»
textual
Листинг программы
- Public Class Form1
- Private Delegate Sub _dlg()
- Private CallBack As New _dlg(AddressOf ShowResult)
- Dim count As Long
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Dim th As New MethodInvoker(AddressOf LongProc)
- th.BeginInvoke(Nothing, Nothing)
- End Sub
- Sub LongProc()
- For i As Long = 0 To 4000000000
- count += i
- Next
- Try
- Me.Invoke(CallBack)
- Catch ex As Exception
- Exit Sub
- End Try
- End Sub
- Sub ShowResult()
- Label1.Text = count.ToString
- End Sub
- End Class
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д