| 网站首页 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛 |
 
| 技术教程首页 | 开发语言 | WEB开发 | .NET技术 | 数据库 | 操作系统 | 网页制作 |
 
 
您现在的位置: 编程中国 >> 技术教程 >> .NET技术 >> VB.NET >> VB.NET技术资料 >> 正文
  ►  Visual Basic .NET实现后台处理
Visual Basic .NET实现后台处理
作者:未知    阅读人次:……    文章来源:不详    发布时间:2004-10-8    网友评论()条
 

  接着我们添加方法来实现IClient中定义的接口。

#Region " IClient "

Private Sub TaskStarted(ByVal Controller As Controller) _
Implements IClient.Start

mActive = True

Label1.Text = "Starting"
Label2.Text = "0%"
ProgressBar1.Value = 0
ActivityBar1.Start()
End Sub

Private Sub TaskStatus(ByVal Text As String) _
Implements IClient.Display

Label1.Text = Text
Label2.Text = CStr(mController.Percent) & "%"
ProgressBar1.Value = mController.Percent

End Sub

Private Sub TaskFailed(ByVal e As Exception) _
Implements IClient.Failed

ActivityBar1.Stop()

Label1.Text = e.Message
MsgBox(e.ToString)
mActive = False

End Sub

Private Sub TaskCompleted(ByVal Cancelled As Boolean) _
Implements IClient.Completed

Label1.Text = "Completed"
Label2.Text = CStr(mController.Percent) & "%"
ProgressBar1.Value = mController.Percent
ActivityBar1.Stop()
mActive = False
End Sub
#End Region

  注意所有的代码都没有处理线程。每部分都包含监视后台处理的状态时可以作适当的响应的代码。每次我们都更新过程状态信息的显示、它的完成百分比(在文本框和ProgressBar中)并启动和停止ActivityBar控件。

  标志mActive很重要。当工作线程活动时,如果用户关闭了窗体,程序可能挂起或者不稳定。为了避免这种情况,如果后台处理是激活的,我们截取窗体的Closing事件并在后台处理活动时终止关闭的企图。

  Private Sub Form1_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles
MyBase.Closing
e.Cancel = mActive
End Sub

  在本例中我们选择初始化"取消"操作,这依赖于具体的应用程序需求。

  下面的代码用于实现按钮的Click事件:

Private Sub btnStart_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles
btnStart.Click
mController.Start(New Worker(2000000, 100))
End Sub

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

Label1.Text = "Cancelling ..."
mController.Cancel()
End SubStart

   按钮简单地调用Controller的Start方法,将Worker对象的一个实例传递给它。

  为了使它运行得更有趣,你也许要调整初始化Worker对象得值。本文中的值在两个P3/450得计算机上运行很好。实际的Worker对象执行更有意思的工作,但也是长时间的处理。

  Cancel按钮调用Controller对象Cancel方法,并更新显示来表明有"取消"请求。这仅仅是个"取消"请求,在工作实际停止前也许有一段时间。比较好的方法是给用户一些回应,至少表明点击按钮已经被注意到了。

  运行该程序。Start按钮按下时,Worker启动了,随着它的运行显示在发生变化。你可以在屏幕上移动窗体并与窗体交互,因为UI线程本质上是空闲的,准备好了与你交互。

  同时,工作线程正在后台处理繁忙工作,给UI线程发送周期性的状态更新消息以供显示。

  结论

  多线程是个非常强大的工具,在任何需要长时间运行的事务中都能使用。我们可以用它运行工作代码而不停止用户界面。同时,多线程的使用可能变得难以想象的复杂,更加难于调试。

  但这不总是可行的,我们应该力争给每个工作线程提供一组该线程操作的独立数据。最简单的实现方法是为每个线程创建一个对象,该对象包含线程需要操作的数据和工作的代码。

  通过实现一个结构化的框架作为工作线程与UI线程的中介,我们难以想像地简化了编写多线程工作代码和控制它的UI代码。本文中我有一个框架实例,你能改变它使之适应你的应用程序需求。

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 

 

 
文章录入:静夜思    责任编辑:静夜思 
  • 上一篇文章:

  • 下一篇文章:

  •  
    相关文章
    原创地带
    24小时热门帖子