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

  在很多情况中使用委托。在本例中,它们非常重要,因为它们允许一个线程能调用窗体的方法,因此它运行在窗体的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对象的指针并初始化该对象,因此它有一个指向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方法中我们建立了工作线程然后启动它。

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消息给窗体在后台实现。这意味着窗体获取这些方法调用与它从操作系统本身获取click或 keypress事件非常相象。

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

 

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

  • 下一篇文章:

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