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.


2 comments:
Hi Sunit,
Very informative demo, thank you.
But I notice there is a minor issue in your demo. Just try to click the button two times, first time, it runs without any issue, second time, it will run into "First Chance Exception ..." Error.
Below is my quick fix on "ProgressDialog.vb":
1. Line 43: Me.Close() => Me.Hide()
2. Line 56: dialog.Close() => dialog.Hide()
That's all.
Post a Comment