I am new to VB.NET. I had programmed in Visual Basic 4 many many years ago. Recently I had to use Visual Studio 2010 to create a quick application for internal usage. Now there was a task which took a long time. As per good user interface design it was obvious that a progress update should be shown to keep the end user informed and updated till the task completed.
To cut a long story short, the requirement was to let the long running task continue while a progress bar showed the progress of the task. After searching for examples, I got a basic idea on how to use threads in VB.Net to accomplish the task I had at hand.
I have attached the VS2010 project for you to download and see the code. The main working parts are explained here.
Basic Steps
- Step 1 - Create a basic Windows Form application
- Step 2 - Create a simple Dialog and add a ProgressBar and a Label to it
- Step 3 - Write a method which will launch a separate Thread to perform the long running task
- Step 4 - Write Delegate methods in the Dialog
The code is self explanatory.
Code for the Main Form
Option Explicit On
Option Strict On
Imports System.Threading
' Main form which launches a long running task and
' shows progress update in a separate dialog
Public Class MainForm
Inherits Form
'Flag that indcates if a process is running
Dim isProcessRunning As Boolean = False
'Progress bar dialog
Dim progressDlg As New ProgressDialog
'Long running background process with
'a determinate progress indicator,
'using a seperate modal dialog containing
'a progress bar
<MTAThread()> _
Private Sub ButtonClick1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles ButtonClick1.Click
'If a process is already running,
'warn the user and cancel the operation
If isProcessRunning = True Then
MessageBox.Show("Sorry, a process is already running.", _
"Status", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
Return
End If
'Define a background thread and start the
'long running process in this separate thread
Dim backgroundThread As _
New Threading.Thread(AddressOf DoLongRunningProcess)
' Start the background process thread
backgroundThread.Start()
' Open the dialog
progressDlg.Show()
End Sub
' The long running process
Public Sub DoLongRunningProcess()
' Set the flag that indicates if a
' process is currently running
isProcessRunning = True
' Iterate from 0 - 100
' On each iteration, pause the thread
' for .05 seconds, then update the
' dialog's progress bar
For n As Integer = 0 To 100
Thread.Sleep(100)
progressDlg.UpdateProgress(n)
Next
' Show a dialog box that confirms the process
' has completed
MessageBox.Show("Thread completed!", "Status", _
MessageBoxButtons.OK, _
MessageBoxIcon.Information)
'Close the dialog when user clicks OK
progressDlg.Close()
' Reset the flag that indicates if a process is
' currently running
isProcessRunning = False
End Sub
End Class
Code for the Progress Dialog
Option Explicit On
Option Strict On
Imports System.Windows.Forms
' Dialog class with a ProgressBar widget to
' show the progress of a long running task
Public Class ProgressDialog
Inherits Form
' Delegate to update the progress
' of the ProgressBar widget
Delegate Sub DelegateUpdate(ByVal progress As Integer)
' Delegate to handle the Close event
' for this dialog
Delegate Sub DelegateClose(ByRef dialog As Form)
' Default constructor which initializes
' this control
Public Sub New()
InitializeComponent()
End Sub
' Method to update the progress bar widget. This
' uses the InvokeRequired and BeginInvoke methods
Public Sub UpdateProgress(ByVal progress As Integer)
If ProgressBar1.InvokeRequired Then
ProgressBar1.BeginInvoke(New DelegateUpdate(AddressOf UpdateDelegateImpl), progress)
Else
ProgressBar1.Value = progress
End If
End Sub
' Overloads the Close method
Public Overloads Sub Close()
If Me.InvokeRequired Then
Me.BeginInvoke(New _
DelegateClose(AddressOf CloseDelegateImpl), Me)
Else
Me.Close()
End If
End Sub
' Implementation of the DelegateUpdate
Sub UpdateDelegateImpl(ByVal progress As Integer)
ProgressBar1.Value = progress
LabelProgress.Text = ""
LabelProgress.Text = progress & CStr("%")
End Sub
' Implmentation of the DelegateClose
Sub CloseDelegateImpl(ByRef dialog As Form)
dialog.Close()
End Sub
End Class
Download Project
I have uploaded the project as a ZIP archive on Google Drive. Click to download.

