' Imports System ' Imports System.Collections Imports System.ComponentModel ' Imports System.Drawing ' Imports System.Threading ' Imports System.Windows.Forms Public Class FibonacciForm Inherits System.Windows.Forms.Form Private numberToCompute As Integer = 0 Private highestPercentageReached As Integer = 0 Public Duration, time1, time2 As Long Public nn, val1, val1s As Long Private val2 As Single Public update1, cnt, cnt1, cancel As Integer Public val3 As Double Public Sub New() InitializeComponent() InitializeForm() End Sub 'New Private Sub StartAsyncButton_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles StartAsyncButton.Click If StartAsyncButton.Text = "Start Async" Then ' Reset the text in the result label. Me.ProgressBar1.Value = 0 ResultLabel1.Text = [String].Empty ResultLabel2.Text = [String].Empty time1 = Hour(Now) * 3600 + Minute(Now) * 60 + Second(Now) nn = Val(NumericUpDown2.Value) update1 = 0 cancel = 0 ' Disable the UpDown control until ' the asynchronous operation is done. Me.NumericUpDown1.Enabled = False Me.NumericUpDown2.Enabled = False ' Disable the Start button while ' the asynchronous operation runs. Me.StartAsyncButton.Enabled = False ' Get the value from the UpDown control. numberToCompute = CInt(NumericUpDown1.Value) ' Reset the variable for percentage tracking. highestPercentageReached = 0 ' Start the asynchronous operation. BackgroundWorker1.RunWorkerAsync(numberToCompute) CancelAsyncButton.Text = "Cancel Async" End If End Sub Private Sub CancelAsyncButton_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles CancelAsyncButton.Click If CancelAsyncButton.Text = "Cancel Async" Then cancel = 1 ' Enable the End button. Me.NumericUpDown1.Enabled = True Me.NumericUpDown2.Enabled = True StartAsyncButton.Enabled = True CancelAsyncButton.Text = "End Async" Else End End If End Sub 'CancelAsyncButton ' This event handler is where the actual work is done. Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork ' Get the BackgroundWorker object that raised this event. Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) ' Assign the result of the computation ' to the Result property of the DoWorkEventArgs ' object. This is will be available to the ' RunWorkerCompleted eventhandler. time1 = Hour(Now) * 3600 + Minute(Now) * 60 + Second(Now) cnt1 = 0 For cnt2 = 1 To nn cnt = cnt2 val1 = ComputeFibonacci(e.Argument, worker, e) time2 = Hour(Now) * 3600 + Minute(Now) * 60 + Second(Now) Duration = time2 - time1 If cancel = 0 Then val2 = Duration / (cnt) : val1s = val1 : cnt1 = cnt update1 = 1 ' Debug.Print("Backgroundworker cnt" + Str(cnt) + " val2" + Str(val2)) Next cnt2 End Sub 'backgroundWorker1_DoWork ' This event handler updates the progress. Private Sub backgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged If update1 = 1 Then ' Debug.Print("ProgressChanged cnt " + Str(cnt1)) ResultLabel1.Text = Str(val1s) ResultLabel2.Text = val2 update1 = 0 End If If cancel = 1 And cnt1 = 0 Then ResultLabel1.Text = "Canceled" Me.ProgressBar1.Value = highestPercentageReached Me.ResultLabel3.Text = cnt1 If cnt1 = nn Then ' Enable the UpDown control. Me.NumericUpDown1.Enabled = True Me.NumericUpDown2.Enabled = True ' Enable the Start button. StartAsyncButton.Enabled = True ' Disable the Cancel button. CancelAsyncButton.Enabled = True CancelAsyncButton.Text = "End Async" End If End Sub ' This is the method that does the actual work. For this ' example, it computes a Fibonacci number and ' reports progress as it does its work. Function ComputeFibonacci( _ ByVal n As Integer, _ ByVal worker As BackgroundWorker, _ ByVal e As DoWorkEventArgs) As Long ' The parameter n must be >= 0 and <= 91. ' Fib(n), with n > 91, overflows a long. If n < 0 OrElse n > 91 Then Throw New ArgumentException( _ "value must be >= 0 and <= 91", "n") End If Dim result As Long = 0 ' Abort the operation if the user has canceled. ' Note that a call to CancelAsync may have set ' CancellationPending to true just after the ' last invocation of this method exits, so this ' code will not have the opportunity to set the ' DoWorkEventArgs.Cancel flag to true. This means ' that RunWorkerCompletedEventArgs.Cancelled will ' not be set to true in your RunWorkerCompleted ' event handler. This is a race condition. 'If worker.CancellationPending Then ' e.Cancel = True 'Else If cancel = 0 Then If n < 2 Then If n = 0 Then result = 0 Else result = 1 Else result = ComputeFibonacci(n - 1, worker, e) + _ ComputeFibonacci(n - 2, worker, e) End If ' Report progress as a percentage of the total task. Dim percentComplete As Integer = _ CSng(n) / CSng(numberToCompute) * 100 * (cnt / nn) ' Debug.Print(n) ' worker.ReportProgress(percentComplete) If percentComplete > highestPercentageReached Then highestPercentageReached = percentComplete 'Debug.Print(Str(n) + " " + Str(highestPercentageReached)) worker.ReportProgress(percentComplete) End If End If Return result End Function Private Sub InitializeForm() Dim hh As Single ' 'numericUpDown1 ' Me.NumericUpDown1.Location = New System.Drawing.Point(16, 16) ' 'resultLabel1 ' Me.ResultLabel1.Location = New System.Drawing.Point(112, 16) Me.ResultLabel1.Size = New System.Drawing.Size(70, 23) Me.ResultLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ' 'resultLabel2 ' Me.ResultLabel2.Location = New System.Drawing.Point(200, 16) Me.ResultLabel2.Size = New System.Drawing.Size(70, 23) Me.ResultLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ' 'progressBar1 ' Me.ProgressBar1.Location = New System.Drawing.Point(18, 48) Me.ProgressBar1.Size = New System.Drawing.Size(256, 8) ' 'Label1 ' hh = 16 Me.Label1.Location = New System.Drawing.Point(hh, 72) Me.Label1.Size = New System.Drawing.Size(33, 13) ' 'NumericUpDown2 ' hh = hh + 33 + 10 Me.NumericUpDown2.Location = New System.Drawing.Point(hh, 72) Me.NumericUpDown2.Size = New System.Drawing.Size(48, 20) ' 'resultLabel3 ' hh = hh + 48 + 10 Me.ResultLabel3.Location = New System.Drawing.Point(hh, 72) Me.ResultLabel3.Size = New System.Drawing.Size(40, 23) Me.ResultLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ' 'startAsyncButton ' hh = 16 Me.StartAsyncButton.Location = New System.Drawing.Point(hh, 102) Me.StartAsyncButton.Size = New System.Drawing.Size(80, 23) Me.StartAsyncButton.Text = "Start Async" ' 'CancelAsyncButton ' hh = hh + 80 + 10 'Me.CancelAsyncButton.Enabled = False Me.CancelAsyncButton.Location = New System.Drawing.Point(hh, 102) Me.CancelAsyncButton.Size = New System.Drawing.Size(80, 23) Me.CancelAsyncButton.Text = "End Async" ' 'backgroundWorker1 ' Me.backgroundWorker1.WorkerReportsProgress = True Me.backgroundWorker1.WorkerSupportsCancellation = True ' 'FibonacciForm ' Me.ClientSize = New System.Drawing.Size(280, 138) End Sub 'InitializeComponent_ Shared Sub Main() Application.Run(New FibonacciForm) End Sub 'Main End Class 'FibonacciForm