实现
我们将在一个类库项目中实现框架,这样就可以在任何需要执行后台处理的应用程序中使用它。
打开Visual
Studio .NET并建立一个叫做Background的新类库应用程序。因为该库包含一个Windows窗体控件和窗体,我们需要使用Add
References对话框引用System.Windows.Forms.dll和System.Windows.Drawing.dll。此外,我们使用图6中显示的项目属性对话框可以导入这些全项目(project-wide)的名字空间。
图6:使用项目属性添加全项目名字空间的导入
这完成后我们准备写代码了。从建立接口开始。
定义接口程序
给项目添加一个叫IClient的类,代码如下:
Sub Start(ByVal Controller As Controller)
Sub Display(ByVal Text As String)
Sub Failed(ByVal e As Exception)
Sub Completed(ByVal Cancelled As Boolean)
End Interface
接着添加一个叫IWorker的类,代码如下:
Sub Initialize(ByVal Controller As IController)
Sub Start()
End Interface
最后使用下面的代码添加一个叫IController的类:
ReadOnly Property Running() As Boolean
Sub Display(ByVal Text As String)
Sub SetPercent(ByVal Percent As Integer)
Sub Failed(ByVal e As Exception)
Sub Completed(ByVal Cancelled As Boolean)
End Interface
这时我们已经定义了先前讨论过的类图中的所有接口。因此,现在我们可以实现Controller类。
现在我们将实现框架的核心部分--Controller类。该类将包含启动工作线程的代码并在工作线程完成前,作为UI线程和工作线程的中介。
给项目添加一个叫Controller的新类。首先我们将添加一个Imports并声明一些变量:
Imports System.Threading
Public Class Controller
Implements IController
Private mWorker As IWorker
Private mClient As Form
Private mRunning As Boolean
Private mPercent As Integer
接着我们需要定义一些委托(delegate)。委托是指向方法的形式指针,并且某个方法的委托必须与该方法的特征(参数类型等)相同。
在很多情况中使用委托。在本例中,它们非常重要,因为它们允许一个线程能调用窗体的方法,因此它运行在窗体的UI线程中。IClient所定义的三个窗体的方法都需要委托:
Private Delegate Sub CompletedDelegate(ByVal Cancelled As Boolean)
'本委托的特征与IClient.Display匹配,用于安全地调用UI线程上的法
Private Delegate Sub DisplayDelegate(ByVal Text As String)
'本委托的特征与IClient.Failed匹配,用于安全地调用UI线程上的法
Private Delegate Sub FailedDelegate(ByVal e As Exception)
IClient也定义了Start方法,但我们将从UI线程自身中调用它,因此不需要委托。
下一步写将被UI线程调用的代码。该代码包含constructor、Start、Cancel方法和Percent属性。我将这些写入一个区域(Region),可以使它们在UI线程中被调用时比较清晰。
' 使用客户(client)初始化controller
Public Sub New(ByVal Client As IClient)
mClient = CType(Client, Form)
End Sub
' 本方法被UI调用并在UI线程上运行。它启动工作线程
Public Sub Start(Optional ByVal Worker As IWorker = Nothing)
' 如果已经运行则产生一个错误信息
If mRunning Then
Throw New Exception("Background process already running")
End If
mRunning = True
' 保存worker对象的指针并初始化该对象,因此它有一个指向Controller的指针
mWorker = Worker
mWorker.Initialize(Me)
'创建后台线程作后台处理
Dim backThread As New Thread(AddressOf mWorker.Start)
'开始后台工作
backThread.Start()
' 告诉客户端后台工作开始了
CType(mClient, IClient).Start(Me)
End Sub
'本方法被UI调用并在UI线程上运行。它仅仅设置一个请求"取消"的标记
Public Sub Cancel()
mRunning = False
End Sub
' 返回完成的百分比值,只被UI线程调用
Public ReadOnly Property Percent() As Integer
Get
Return mPercent
End Get
End Property
#End Region
唯一特别的代码是在Start方法中我们建立了工作线程然后启动它。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
- 在asp.net中为Web用户控件
- .NET3.5和VS2008中的ASP.N
- 对.NET Framework 反射的
- Asp.net Ajax 1.0 异步回
- ASP.NET2.0的控件状态和视
- 通过避免下列10个常见ASP.
- 中国地区三级联动下拉菜单
- 解析Asp.net中资源本地化
- 一个无刷新效果定时自动更
- 动态创建MSSQL数据库表存
- asp.net用url重写URLReWri
- 使用ASP.NET Atlas编写显
- 关于ASP.NET调用JavaScrip
- 使用ASP.Net Forms模式实
- asp.net ajax 使用updatep
- 优化ASP.NET应用程序性能
- ASP.NET中动态修改web.con
- ASP.NET中利用Crystal Rep
- asp.net如何生成图片验证
- 基于ASP.NET的Web动态控件
- 分享个极好的无刷新二级联
- asp.net 2.0 上传控件的使
- 创建ASP.NET监视服务器进
- Asp.net把UTF-8编码转换为
- 开发基于ASP.NET WebServi
- asp.net结合html,javascr
- asp.net 2.0下嵌套masterp
- 正则表达式提取数字
- 最新版FreeTextBox(版本3.
- 获取本机上配置好的Oracle
- ASP.Net全局变量的设置和
- VB几个有用的函数
- 用代码画折线图/柱形图/
- FCKeditor2.2 ASP.NET2.0
- 客户端回调实现gridView无
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD



