教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> .NET类 >> VB.NET >> Visual Basic .NET实现后台处理(3) RSS订阅
Visual Basic .NET实现后台处理(3)
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   
实现

  我们将在一个类库项目中实现框架,这样就可以在任何需要执行后台处理的应用程序中使用它。

  打开Visual Studio .NET并建立一个叫做Background的新类库应用程序。因为该库包含一个Windows窗体控件和窗体,我们需要使用Add References对话框引用System.Windows.Forms.dll和System.Windows.Drawing.dll。此外,我们使用图6中显示的项目&&属性对话框可以导入这些全项目(project-wide)的名字空间。


   图6:使用项目&&属性添加全项目名字空间的导入

  这完成后我们准备写代码了。从建立&&接口开始。

  定义&&接口程序

  给项目添加一个叫IClient的类,代码如下:
Public Interface 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的类,代码如下:

Public Interface IWorker

Sub Initialize(ByVal Controller As IController)

Sub Start()

End Interface

  最后使用下面的代码添加一个叫IController的类:

Public 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类

  现在我们将实现框架的核心部分--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)。委托是指向方法的形式&&keyword=%D6%B8%D5%EB&Submit=+%CB%D1%CB%F7+">指针,并且某个方法的委托必须与该方法的特征(参数类型等)相同。
 在很多情况中使用委托。在本例中,它们非常重要,因为它们允许一个线程能调用窗体的方法,因此它运行在窗体的UI线程中。IClient所定义的三个窗体的方法都需要委托:

'本委托的特征与IClient.Completed匹配,用于安全地调用UI线程上的法

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线程中被调用时比较清晰。

#Region " Code called from UI thread "

' 使用客户(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对象的&&keyword=%D6%B8%D5%EB&Submit=+%CB%D1%CB%F7+">指针并初始化该对象,因此它有一个指向Controller的&&keyword=%D6%B8%D5%EB&Submit=+%CB%D1%CB%F7+">指针

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方法中我们建立了工作线程然后启动它。

Dim backThread As New Thread(AddressOf mWorker.Start)

backThread.Start()

  为了建立该线程,我们传递了Worker 对象的IWorker 的&&接口的Start方法的地址。接着我们简单地调用了线程对象的Start方法开始该处理。在这儿我们必须仔细,保证既没有UI与Worker直接交互,也没有Worker与UI直接交互。

  注意"取消"方法只是设置了一个标志用于显示我们想工作不再运行。直到工作代码周期性查看是否该停止运行。

  现在我们实现在Worker对象运行时将被工作线程调用的代码。该代码有趣一些,它将工作线程调用的Display和Completed方法传递到UI,但却在UI线程上。

  为了实现它,我们使用窗体对象的Invoke方法。Invoke方法接受指向该窗体将调用的方法的委托,同时有一个含有该方法的参数的类型对象数组。

  Invoke方法不能直接调用窗体的方法。它请求窗体转向并使用该窗体的UI线程来调用方法。这通过发送一个Windows消息给窗体在后台实现。这意味着窗体获取这些方法调用与它从/Article/czxt/Index.html">操作系统本身获取click或 keypress&&事件非常相象。

来源:十度教育
作者:
关键字:Visual,Basic
发表日期:2006-5-15 13:10:28

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:Visual Basic .NET实现后台处理(2)   下一篇:Visual Basic .NET实现后台处理(4)


2008-10-16 4:19:29
本文的相类似文章
  • Visual Basic_美化你的文字
  • Visual Basic 6中发送邮件的新方法
  • Visual Basic 中字符淡出淡入的实现
  • 想不到的VB指针用法{Visual Basic6.0}
  • Visual C#的SQL Server编程
  • 建立你自己的浏览器-发送到Visual Interdev
  • Visual Basic小游戏:猜英雄
  • Visual Basic的九次蜕变
  • Visual Basic内嵌汇编语言解决方案
  • Visual Basic不可能消失
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com