一、RegisterWaitForSingleObject 方法
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) 注册一个等待 WaitHandle 的委托,并指定一个 32 位带符号整数来表示超时值(以毫秒为单位)。
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) 注册一个等待 WaitHandle 的委托,并指定一个 64 位带符号整数来表示超时值(以毫秒为单位)。
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) 注册一个等待 WaitHandle 的委托,并指定一个 TimeSpan 值来表示超时时间。
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) 指定表示超时(以毫秒为单位)的 32 位无符号整数,注册一个委托等待 WaitHandle。
将指定的委托排队到线程池。
Public Shared Function RegisterWaitForSingleObject ( _
waitObject As WaitHandle, _
callBack As WaitOrTimerCallback, _
state As Object, _
millisecondsTimeOutInterval As Integer, _
executeOnlyOnce As Boolean _
) As RegisteredWaitHandle
参数
waitObject
类型:System.Threading.WaitHandle
要注册的 WaitHandle。 使用 WaitHandle 而非 Mutex。
callBack
类型:System.Threading.WaitOrTimerCallback
waitObject 参数终止时调用的 WaitOrTimerCallback 委托。
state
类型:System.Object
传递给委托的对象。
millisecondsTimeOutInterval
类型:System.Int32
以毫秒为单位的超时。 如果 millisecondsTimeOutInterval 参数为 0(零),函数将测试对象的状态并立即返回。 如果 millisecondsTimeOutInterval 为 -1,则函数的超时间隔永远不过期。
executeOnlyOnce
类型:System.Boolean
如果为 true,表示在调用了委托后,线程将不再在 waitObject 参数上等待;如果为 false,表示每次完成等待操作后都重置计时器,直到注销等待。
当发生以下情况之一时,辅助线程将执行委托:
指定对象处于终止状态。
超时间隔已过期。
RegisterWaitForSingleObject 方法检查指定对象的 WaitHandle 的当前状态。 如果对象状态为非终止状态,则此方法将注册一个等待操作。 此等待操作由线程池中的一个线程来执行。 当对象状态变为终止或超时间隔已过期时,委托由辅助线程执行。 如果 timeOutInterval 参数不为 0(零),并且 executeOnlyOnce 参数为 false,则每当事件收到信号或超时间隔过期时都会重置计时器。
若要取消等待操作,请调用 RegisteredWaitHandle.Unregister 方法。
等待线程使用 Win32 WaitForMultipleObjects 函数来监视已注册的等待操作。 因此,如果必须在对 RegisterWaitForSingleObject 的多次调用中使用相同的本机操作系统句柄,则必须使用 Win32DuplicateHandle 函数重复该句柄。 请注意,不应为传递到 RegisterWaitForSingleObject 的事件对象发出脉冲,这是因为等待线程在重置前可能不会检测到该事件已终止。
返回前,函数将修改某些类型的同步对象的状态。 修改仅发生在其终止状态满足等待条件的对象上。 例如,信号量计数减少一。
二、WaitOrTimerCallback 委托
'声明
<ComVisibleAttribute(True)> _
Public Delegate Sub WaitOrTimerCallback ( _
state As Object, _
timedOut As Boolean _
)
参数
state
类型:System.Object
一个对象,包含回调方法在每次执行时要使用的信息。
timedOut
类型:System.Boolean
如果 WaitHandle 超时,则为 true;如果其终止,则为 false。
备注
--------------------------------------------------------------------------------
WaitOrTimerCallback 表示当已注册的等待句柄超时或终止时要执行的回调方法。 创建委托,方法是将回调方法传递给 WaitOrTimerCallback 构造函数。 您的方法必须具有此处所显示的签名。
通过将 WaitOrTimerCallback 委托和 WaitHandle 传递给 ThreadPool.RegisterWaitForSingleObject 创建已注册的等待句柄。 每次 WaitHandle 超时或终止时,执行您的回调方法。
[Visual Basic]
注意
Visual Basic 用户可以省略 WaitOrTimerCallback 构造函数,在向 RegisterWaitForSingleObject 传递回调方法时只需使用 AddressOf 运算符即可。 Visual Basic 将自动调用正确的委托构造函数。
如果要将信息传递给回调方法,则在创建已注册的等待句柄时,创建一个包含所需信息的对象并将它传递给 RegisterWaitForSingleObject。 每次执行您的回调方法时,state 参数都包含此对象。
三、Unregister方法
<ComVisibleAttribute(True)> _
Public Function Unregister ( _
waitObject As WaitHandle _
) As Boolean
参数
waitObject
类型:System.Threading.WaitHandle
要发出信号的 WaitHandle。
返回值
类型:System.Boolean
如果函数成功,则为 true;否则为 false。
备注
--------------------------------------------------------------------------------
如果指定了 waitObject,只有在成功注销 RegisteredWaitHandle 之后它才会终止。 如果在 Unregister 执行时回调方法正在进行,则直到回调方法完成之后 waitObject 才会终止。 特别是,如果回调方法执行 Unregister,则直到回调方法完成之后 waitObject 才会终止。
Imports System
Imports System.Threading
Imports System.Runtime.InteropServices
Imports System.Diagnostics
Imports System.Diagnostics.ThreadState
Module Module1
Dim jg As Long = 0
Public Class TaskInfo
Public Handle As RegisteredWaitHandle = Nothing
Public OtherInfo As String = "default"
Public ev As AutoResetEvent
End Class
<MTAThread()> _
Sub Main()
'定义AutoResetEvent和RegisteredWaitHandle对象
Dim myHandle As RegisteredWaitHandle = Nothing
Dim ti As New TaskInfo()
ti.ev = New AutoResetEvent(False)
ti.OtherInfo = "deepfuture test"
'注册等待,等待线程的任务就是定时取计算结果,如果没有计算完成,就继续等待
ti.Handle = ThreadPool.RegisterWaitForSingleObject( _
ti.ev, _
New WaitOrTimerCallback(AddressOf mythreadrun), _
ti, _
100, _
False _
)
Console.Write("{0},开始执行线程,主线程{1}正在计算结果", Now.ToLongTimeString, Thread.CurrentThread.ManagedThreadId)
'等待并执行其它代码
For mynum = 1 To 100
jg += mynum
Thread.Sleep(10)
Console.WriteLine("主线程{0}正在运行.....当前计算结果为{1}", Now.ToLongTimeString, jg)
Next
Console.WriteLine("主线程 " & Now.ToLongTimeString & "线程计算完毕!")
'设置为终止状态,触发回调
ti.ev.Set()
Thread.Sleep(20)
End Sub
Public Sub mythreadrun(ByVal state As Object, ByVal timedOut As Boolean)
'本线程的任务是的计算完成后显示结果,没计算完成时,做其它工作,
'在这里其他工作就是显示一个"."
Dim ti As TaskInfo = CType(state, TaskInfo)
If timedOut Then
'时间到,仍没计算完毕,为非终止状态
Console.WriteLine("等待时间到,计算没有完毕,继续等待...")
Else
If Not ti.Handle Is Nothing Then
'已经终止
ti.Handle.Unregister(Nothing)
End If
Console.WriteLine("主线程{0}运行完成.....读取最终计算结果为{1}", Now.ToLongTimeString, jg)
End If
End Sub
End Module
- 大小: 95.4 KB
分享到:
相关推荐
最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt ...浅述WinForm多线程编程与Control.Invoke的应用.txt 微软.Net开发中的多线程编程总结.txt 线程中的参数传递.txt
6. **异步编程**:VB.NET提供了`Async`和`Await`关键字,用于编写非阻塞的异步代码,优化UI响应速度和资源利用率。 7. **错误处理**:使用`Try...Catch...Finally`语句进行异常处理,帮助开发者更好地控制程序运行...
本压缩包"新VB.NET源代码2023-11-18-23-50QZQ.zip"包含的是最新的VB.NET编程源代码,可能是某个项目或应用的开发资源。由于标签为空,我们无法得知具体的应用领域,但从文件名推测,这可能是一个更新或改进过的版本...
VB.NET是一种基于.NET框架的编程语言,由微软公司开发,是Visual Basic的现代版本,具有更强大的功能和更丰富的库支持。在这个项目中,“VB.NET---计算器---源代码”是一个使用VB.NET编写的简单计算器应用程序。它...
VB.NET多线程编程技术是一种提高应用程序性能的关键手段,尤其对于时间密集型或处理密集型的任务,它能够显著提升程序响应速度和资源利用效率。在VB.NET中,多线程编程主要依赖于`.NET框架`中的`System.Threading`...
VB.NET判断网络连接状态
在VB.NET编程环境中,多线程技术是一种提升应用程序性能的重要手段。它允许程序同时执行多个任务,从而提高程序的响应速度和效率。本实例主要关注如何在VB.NET中实现多线程,通过创建并运行三个具有类似功能的方法...
此外,VB.NET还支持XML处理、Web服务调用、多线程编程、反射以及与.NET Framework其他组件的集成,这些都是现代软件开发中不可或缺的部分。 总的来说,《VB.NET应用教程第2版》的数据包是学习VB.NET编程的宝贵资料...
使用VB.NET对PLC进行读写数据,方便快捷,对入门者有很好的编程
**VB.NET与VB编程方面的主要区别** VB.NET和Visual Basic(简称VB)是两种不同的编程环境,虽然它们在历史上有着紧密的联系,但随着时间的推移,两者之间的差异变得越来越明显。本文将深入探讨VB.NET与VB编程的主要...
VB.NET是一种面向对象的编程语言,由微软公司开发,它与.NET框架紧密集成,提供了丰富的库和工具支持,使得开发Windows桌面应用、Web应用以及服务变得更为便捷。设计模式在VB.NET中的应用,可以极大地提高代码质量和...
11. **多线程与并发**:VB.NET提供了Threading类库,用于处理多线程编程,以实现并行计算和优化性能。了解如何正确管理和同步线程是提高程序效率的关键。 这个高级教程涵盖了VB.NET的核心高级特性,通过深入学习,...
VB.NET是一种基于.NET框架的编程语言,由微软公司开发,用于构建桌面应用、Web应用以及Windows服务等。这个“VB.net编程实例(101个)”集合为初学者提供了丰富的学习资源,涵盖了多个关键领域,包括Web开发、...
【VB.Net 2010 与 VB6 的差异与转换】 VB.Net 2010 是 Microsoft .Net Framework 下的一个编程环境,相较于之前的 VB6(Visual Basic 6.0),它引入了许多新特性和改进,旨在提升开发效率和代码质量。VB6 是基于...
《VB.NET实例解析应用编程100例》是一本深入探讨VB.NET编程实践的书籍,旨在帮助开发者通过具体的实例学习和掌握VB.NET编程技术。这本书可能涵盖了从基础语法到高级特性的广泛主题,包括控件使用、数据访问、网络...
VB.Net to C# Converter(代码转换工具) v2.23 VB.Net to C Sharp Converter 是一款将vb.net代码转化为c#代码的程序。在转化过程中,保留了原有的注释和变量名。 VB.Net to C# Converter是一款代码转换软件,将用户...
AUTOCAD VBA&VB.NET开发基础与实例教程 c#
第一部分 Visual Basic.net基础 第二部分 vb.net的语法部分 第三部分 visual basic.net的运算 第四部分 visual basic.net的常用控件 第六部分 vb.net的OOP...第八部分 vb.net的多线程 第九部分 vb.net的文件和出错处理
在VB.NET编程环境中,开发摄像头相关的应用程序是一项常见的需求,尤其在多媒体、监控或者视频会议等领域。本项目"VB.Net_Camera.rar"提供了一个简单的实例,教你如何利用VB.NET实现摄像头拍照的功能。下面将详细...
vb.net2003编写的HID测试程序,根据网上的VB6修改,功能已经全部实现。包括HidD_GetHidGuid,SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces,CreateFile,SetupDiGetDeviceInterfaceDetail等API函数的声明和...