设为首页 | 加入收藏 RSS订阅 | 高级搜索 | 收藏本站 | 论坛
用户名: 密码: 验证码: gdcode 注册
首页 | 财税咨询 | 税收实务 | 纳税辅导 | 税收优惠 | 税务策划 | 财税实务 | 财务研究 | 税务知识 | 财软 | 学院 | 下载 | 数据库技术 | 论坛
logo

在VisualBasic.NET中实现后台进程(三)

时间:2007-06-15 来源: 作者: 【字体: 减小 增大点击: 收藏 | 投稿
  
创建显示的窗体

最后,我们可以创建窗体,将其用于启动或取消后台进程。该窗体还将显示活动和状态信息。

财管家,园,fs119.net

打开Form1的设计器并添加两个按钮(btnStartbtnRequestCancel)、两个标签(Label1Label2)、一个ProgressBar(ProgressBar1)和一个ActivityBar(ActivityBar1),如图7所示。 财管 家园 fs119.net

财软联盟.fs119.net

图7:Form1控件的布局

财,软联盟,fs119.net

该窗体需要实现IClient,以便Controller对象与之交互: 财管.家园.fs119.net

ImportsBackground PublicClassForm1 InheritsSystem.Windows.Forms.Form ImplementsIClient 财管家,园,fs119.net

该窗体还需要Controller对象和一个标志,用以跟踪后台操作是处于活动状态还是处于完成状态。 财管.家园.fs119.net

PrivatemControllerAsNewController(Me) PrivatemActiveAsBoolean
财软联.盟.fs119.net

然后,我们可以添加方法,以实现由IClient定义的接口。建议将这些方法放在Region中,以表示它们实现的是辅助接口:

财软联 盟 fs119.net

#Region"IClient" PrivateSubTaskStarted(ByValControllerAsController)_ ImplementsIClient.Start mActive=True Label1.Text="Starting" Label2.Text="0%" ProgressBar1.Value=0 ActivityBar1.Start() EndSub PrivateSubTaskStatus(ByValTextAsString)_ ImplementsIClient.Display Label1.Text=Text Label2.Text=CStr(mController.Percent)&"%" ProgressBar1.Value=mController.Percent EndSub PrivateSubTaskFailed(ByValeAsException)_ ImplementsIClient.Failed ActivityBar1.Stop() Label1.Text=e.Message MsgBox(e.ToString) mActive=False EndSub PrivateSubTaskCompleted(ByValCancelledAsBoolean)_ ImplementsIClient.Completed Label1.Text="Completed" Label2.Text=CStr(mController.Percent)&"%" ProgressBar1.Value=mController.Percent ActivityBar1.Stop() mActive=False EndSub #EndRegion
财管,家园,fs119.net
财软联,盟,fs119.net

财软联,盟,fs119.net


财软联盟,fs119.net

财,管家园,fs119.net 财软联.盟.fs119.net

请注意,这一段代码中的所有内容均与线程无关,其中的每一部分代码都可以在我们得知后台操作的状态时做出相应的响应。每次响应后,我们都会更新显示以表明进程的状态和完成百分比(以文字的形式或通过ProgressBar显示),并启动和停止ActivityBar控件。 财管 家园 fs119.net

mActive标志非常重要。如果用户在辅助线程处于活动状态时关闭窗体,应用程序可能会挂起或变得不稳定。要防止出现这种情况,我们可以打断窗体的Closing事件并取消关闭尝试(如果后台进程处于活动状态)。

财,管家园,fs119.net

PrivateSubForm1_Closing(ByValsenderAsObject,_ ByValeAsSystem.ComponentModel.CancelEventArgs)_ HandlesMyBase.Closing e.Cancel=mActive EndSub

财.软联盟.fs119.net

我们还可以选择在这种情况下初始化取消操作,但是这取决于特定的应用程序要求。 财管 家园 fs119.net

其余的代码都是为了实现按钮的Click事件。

财管.家园.fs119.net

PrivateSubbtnStart_Click(ByValsenderAsSystem.Object,_ ByValeAsSystem.EventArgs)HandlesbtnStart.Click mController.Start(NewWorker(2000000,100)) EndSub PrivateSubbtnStop_Click(ByValsenderAsSystem.Object,_ ByValeAsSystem.EventArgs)HandlesbtnStop.Click Label1.Text="Cancelling..." mController.Cancel() EndSub
财管家,园,fs119.net

Start(开始)按钮只调用Controller对象的Start方法,并将Worker对象的实例传递给它。

财管 家园 fs119.net

您可能需要调整用于初始化Worker对象的值,以便在您的计算机上获得所需的结果。这些特定的值提供了双处理器P3/450计算机上的一个良好示例。显然,这只是用于测试目的。真正的Worker对象将实现更有意义、运行时间更长的进程。 财 软联盟 fs119.net

Cancel(取消)按钮将调用Controller对象的Cancel方法,同时还会更新显示,以表明已请求取消。请记住,这只是一个取消“请求”,在辅助线程真正停止运行之前可能需要等待一些时间。最好能够为用户提供即时反馈,至少应让用户知道系统已经注意到用户的单击按钮操作。

财管家园 fs119.net

现在,我们可以运行应用程序了。单击Start(开始)按钮时,Worker就应该开始运行,而且显示的内容会在运行时更新。您可以将窗体移动到屏幕上的任意位置,也可以与其交互,因为UI线程本质上还处于空闲状态,可以随时与您交互。

财管家 园 fs119.net

同时,辅助线程在后台进行大量复杂的工作,并定期将状态更新信息发送给UI线程以进行显示。 财管,家园,fs119.net

小结

多线程是一个功能强大的工具,我们可以在每次需要执行长时间运行的任务时使用该工具。我们可以用它运行辅助代码,而无需绑定用户界面。但同时要注意,多线程操作非常复杂,要正确操作并不容易,而且调试起来也比较困难。 财 软联盟 fs119.net

尽管不一定能够实现,但我们还是应该尽量为每个辅助线程提供一组它可以操作的独立数据。要达到这个目的,最简单的方法就是为每个线程创建一个对象,对象中包含该线程可以操作的数据以及完成工作所需的代码。

财软.联盟.fs119.net

通过实现结构化的架构,使之充当辅助线程和UI线程之间的媒介,我们可以大大简化编写多线程代码和UI以对其进行控制的过程。本文就介绍了这样一个架构,您可以根据需要使用或进行调整,以满足特定的应用需要.

财软联盟 fs119.net

财软 联盟 fs119.net

财 管家园 fs119.net


文章摘自网络,如有侵权,请与我们联系.
数据统计中!!
上一篇:在VisualBasic.NET中实现后台进程(二)
下一篇:没有了

用户名: 密码: 匿名? 注册