手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

Visual Basic .NET实现后台处理(下 )

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
建立显示窗体

  最后建立一个窗体来启动和取消后台处理。它也显示活动和状态信息。

  给窗体添加两个按钮(btnStart和btnRequestCancel)、两个label(Label1和Label2)、一个ProgressBar(ProgressBar1)和ActivityBar (ActivityBar1),如图7所示:


    图7:Form1的布局

  窗体需要执行IClient,这样Controller控件才能与它交互。

  Imports Background Public Class Form1 Inherits System.Windows.Forms.Form Implements IClient窗体也需要一个Controller对象和一个标志来追踪后台处理是活动的或完成了。

  Private mController As New Controller(Me) Private mActive As Boolean

  接着我们添加方法来实现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代码。本文中我有一个框架实例,你能改变它使之适应你的应用程序需求。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!