[VB.NET]多线程——参数和返回值.txt
从线程池线程返回值有点复杂。不允许使用从函数调用返回值的标准方法,因为只有 Sub 过程可以排队进入线程池。提供参数和返回值的一种方法是将参数、返回值和方法包装到包装类中,如线程参数和返回值中所述。一种更简单的提供参数和返回值的方法,是使用 QueueUserWorkItem 方法的 ByVal 状态对象变量(可选)。如果使用此变量将引用传递给类的实例,则该实例的成员便可以由线程池线程修改并用作返回值。您可以修改由变量(通过值传递)引用的对象,这在开始可能并非显而易见,但的确是可能的,因为只有对象引用是通过值传递的。对由对象引用所引用的对象成员进行更改之后,这些更改将应用于实际的类实例。 不能使用结构返回状态对象中的值。因为结构是值类型,异步进程所作的更改并不更改原始结构的成员。如果不需要返回值,则可以使用结构提供参数。 Friend Class StateObj Sub ThreadPoolTest() Sub SomeOtherTask(ByVal StateObj As Object) Sub AnotherTask(ByVal StateObj As Object) ' 将状态对象字段用作参数。 ' 状态对象作为 Object 进行传递。 ' 将其强制转换为特定的类型以使其更易于使用。 Dim StObj As StateObj StObj = CType(StateObj,StateObj) MsgBox("StrArg 包含字符串 " & StObj.StrArg) MsgBox("IntArg 包含数字" & CStr(StObj.IntArg)) ' 将字段用作返回值。 StObj.RetVal = "AnotherTask 的返回值"End Sub公共语言运行时自动为排队的线程池任务创建线程,然后,当任务完成后释放这些资源。将任务排队后,很难再将其取消。ThreadPool 线程始终使用多线程单元 (MTA) 线程模型来运行。如果需要使用单线程单元 (STA) 模型的线程,则应手动创建线程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |