怎样使用 BackgroundWorker

lakibo 2006-11-22 05:26:56
如题。谢谢您。
...全文
811 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lakibo 2006-11-26
  • 打赏
  • 举报
回复
顶一下
lakibo 2006-11-25
  • 打赏
  • 举报
回复
谢谢你们的回复!

请问大家我的程序里这样处理可以吗

{
此程序操作本地或远程 mysql 数据库

我使用了 BackgroundWorker }

Function updategrid(ByVal sql As String, ByRef cgrid As DataGridView) As Boolean
Me.currentGrid = cgrid
operation = "updategrid"
Me.myWorker.RunWorkerAsync(sql)
MainForm.setProcessing()
Return True
End Function

当 MainForm.setProcessing() called, 一个对话框被打开(用户无法关闭)
当 myWorker_RunWorkerCompleted 时 ,MainForm.setEndProcessing () called , 关闭对话框。

请问这样处理会不会有问题呢?


Function updategrid(ByVal sql As String, ByRef cgrid As DataGridView) As Boolean
Me.currentGrid = cgrid
operation = "updategrid"
Me.myWorker.RunWorkerAsync(sql)
MainForm.setProcessing()
Return True
End Function



Private Sub myWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles myWorker.DoWork
Thread.CurrentThread.Sleep(200)
Select Case operation
Case "connect"
e.Result = act_connect()
Case "sqlselect"
e.Result = act_sqlselect(e.Argument)
Case "updategrid"
e.Result = act_updategrid(e.Argument)
Case "acceptchanges"
e.Result = act_acceptGridChanges(e.Argument)
Case "execsql"
e.Result = act_execSql(e.Argument)
Case "disconnect"
End Select

End Sub 'myWorker_DoWork


Private Sub myWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles myWorker.RunWorkerCompleted
' First, handle the case where an exception was thrown.
If Not (e.Error Is Nothing) Then
MessageBox.Show(e.Error.Message)
MainForm.setEndProcessing()
Else
' Finally, handle the case where the operation succeeded.
Select Case operation
Case "connect"
connected = e.Result
StartForm.setEndProcessing(connected)
Case "sqlselect"
MainForm.setSqlSelectResult(e.Result)
MainForm.setEndProcessing()
Case "updategrid"
currentGrid.DataSource = CType(e.Result, DataTable)
MainForm.setEndProcessing()
Case "acceptchanges"
MainForm.setEndProcessing()
Case "execsql"
MainForm.setEndProcessing()
Case "disconnect"
End Select
End If
阿牛138588 2006-11-25
  • 打赏
  • 举报
回复
有详细关键字的问题应先去msdn查询,浪费100分
precipitant 2006-11-25
  • 打赏
  • 举报
回复
Private Sub cancelAsyncButton_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles cancelAsyncButton.Click

' Cancel the asynchronous operation.
Me.backgroundWorker1.CancelAsync()

' Disable the Cancel button.
cancelAsyncButton.Enabled = False

End Sub 'cancelAsyncButton_Click

' 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.
e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub 'backgroundWorker1_DoWork

' This event handler deals with the results of the
' background operation.
Private Sub backgroundWorker1_RunWorkerCompleted( _
ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) _
Handles backgroundWorker1.RunWorkerCompleted

' First, handle the case where an exception was thrown.
If Not (e.Error Is Nothing) Then
MessageBox.Show(e.Error.Message)
ElseIf e.Cancelled Then
' Next, handle the case where the user canceled the
' operation.
' Note that due to a race condition in
' the DoWork event handler, the Cancelled
' flag may not have been set, even though
' CancelAsync was called.
resultLabel.Text = "Canceled"
Else
' Finally, handle the case where the operation succeeded.
resultLabel.Text = e.Result.ToString()
End If

' Enable the UpDown control.
Me.numericUpDown1.Enabled = True

' Enable the Start button.
startAsyncButton.Enabled = True

' Disable the Cancel button.
cancelAsyncButton.Enabled = False
End Sub 'backgroundWorker1_RunWorkerCompleted

' This event handler updates the progress bar.
Private Sub backgroundWorker1_ProgressChanged( _
ByVal sender As Object, ByVal e As ProgressChangedEventArgs) _
Handles backgroundWorker1.ProgressChanged

Me.progressBar1.Value = e.ProgressPercentage

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 n < 2 Then
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
If percentComplete > highestPercentageReached Then
highestPercentageReached = percentComplete
worker.ReportProgress(percentComplete)
End If

End If

Return result

End Function


Private Sub InitializeComponent()
Me.numericUpDown1 = New System.Windows.Forms.NumericUpDown
Me.startAsyncButton = New System.Windows.Forms.Button
Me.cancelAsyncButton = New System.Windows.Forms.Button
Me.resultLabel = New System.Windows.Forms.Label
Me.progressBar1 = New System.Windows.Forms.ProgressBar
Me.backgroundWorker1 = New System.ComponentModel.BackgroundWorker
CType(Me.numericUpDown1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'numericUpDown1
'
Me.numericUpDown1.Location = New System.Drawing.Point(16, 16)
Me.numericUpDown1.Maximum = New Decimal(New Integer() {91, 0, 0, 0})
Me.numericUpDown1.Minimum = New Decimal(New Integer() {1, 0, 0, 0})
Me.numericUpDown1.Name = "numericUpDown1"
Me.numericUpDown1.Size = New System.Drawing.Size(80, 20)
Me.numericUpDown1.TabIndex = 0
Me.numericUpDown1.Value = New Decimal(New Integer() {1, 0, 0, 0})
'
'startAsyncButton
'
Me.startAsyncButton.Location = New System.Drawing.Point(16, 72)
Me.startAsyncButton.Name = "startAsyncButton"
Me.startAsyncButton.Size = New System.Drawing.Size(120, 23)
Me.startAsyncButton.TabIndex = 1
Me.startAsyncButton.Text = "Start Async"
'
'cancelAsyncButton
'
Me.cancelAsyncButton.Enabled = False
Me.cancelAsyncButton.Location = New System.Drawing.Point(153, 72)
Me.cancelAsyncButton.Name = "cancelAsyncButton"
Me.cancelAsyncButton.Size = New System.Drawing.Size(119, 23)
Me.cancelAsyncButton.TabIndex = 2
Me.cancelAsyncButton.Text = "Cancel Async"
'
'resultLabel
'
Me.resultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
Me.resultLabel.Location = New System.Drawing.Point(112, 16)
Me.resultLabel.Name = "resultLabel"
Me.resultLabel.Size = New System.Drawing.Size(160, 23)
Me.resultLabel.TabIndex = 3
Me.resultLabel.Text = "(no result)"
Me.resultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'progressBar1
'
Me.progressBar1.Location = New System.Drawing.Point(18, 48)
Me.progressBar1.Name = "progressBar1"
Me.progressBar1.Size = New System.Drawing.Size(256, 8)
Me.progressBar1.TabIndex = 4
'
'backgroundWorker1
'
Me.backgroundWorker1.WorkerReportsProgress = True
Me.backgroundWorker1.WorkerSupportsCancellation = True
'
'FibonacciForm
'
Me.ClientSize = New System.Drawing.Size(292, 118)
Me.Controls.Add(Me.progressBar1)
Me.Controls.Add(Me.resultLabel)
Me.Controls.Add(Me.cancelAsyncButton)
Me.Controls.Add(Me.startAsyncButton)
Me.Controls.Add(Me.numericUpDown1)
Me.Name = "FibonacciForm"
Me.Text = "Fibonacci Calculator"
CType(Me.numericUpDown1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)

End Sub 'InitializeComponent

<STAThread()> _
Shared Sub Main()
Application.Run(New FibonacciForm)
End Sub 'Main
End Class 'FibonacciForm




precipitant 2006-11-25
  • 打赏
  • 举报
回复
msdn上的例子:

Visual Basic 复制代码
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

Private numericUpDown1 As System.Windows.Forms.NumericUpDown
Private WithEvents startAsyncButton As System.Windows.Forms.Button
Private WithEvents cancelAsyncButton As System.Windows.Forms.Button
Private progressBar1 As System.Windows.Forms.ProgressBar
Private resultLabel As System.Windows.Forms.Label
Private WithEvents backgroundWorker1 As System.ComponentModel.BackgroundWorker


Public Sub New()
InitializeComponent()
End Sub 'New

Private Sub startAsyncButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles startAsyncButton.Click

' Reset the text in the result label.
resultLabel.Text = [String].Empty

' Disable the UpDown control until
' the asynchronous operation is done.
Me.numericUpDown1.Enabled = False

' Disable the Start button until
' the asynchronous operation is done.
Me.startAsyncButton.Enabled = False

' Enable the Cancel button while
' the asynchronous operation runs.
Me.cancelAsyncButton.Enabled = True

' 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)
End Sub

未完,待续……
precipitant 2006-11-25
  • 打赏
  • 举报
回复
BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。

若要设置后台操作,请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作,请调用 RunWorkerAsync。若要收到进度更新通知,请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知,请对 RunWorkerCompleted 事件进行处理。

您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。


如果后台操作需要参数,请在调用 RunWorkerAsync 时给出参数。在 DoWork 事件处理程序内部,可以从 DoWorkEventArgs.Argument 属性中提取该参数。

应用于此类的 HostProtectionAttribute 属性 (Attribute) 具有以下 Resources 属性 (Property) 值:SharedState。HostProtectionAttribute 不影响桌面应用程序(此类应用程序通常通过双击图标、键入命令或者在浏览器中输入 URL 来启动)。


lakibo 2006-11-24
  • 打赏
  • 举报
回复
顶一下
蒋晟 2006-11-22
  • 打赏
  • 举报
回复
http://msdn2.microsoft.com/en-us/library/8xs8549b.aspx
EddieOO5 2006-11-22
  • 打赏
  • 举报
回复
顶~

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧