vb.net如何通过byref将结构传递给线程?

时间:2019-06-28 00:51:50

标签: vb.net

当我尝试将结构引用传递给线程时,出现构建错误。

dim antenna_frame_buffer as Antenna_Frame_Buffer_structure
...

new_buffer_write_thread = new Thread( AddressOf frame_buffer_write_Thread )
new_buffer_write_thread.Start( antenna_frame_buffer )   

...

    sub frame_buffer_write_Thread( ByRef antenna_frame_buffer as Antenna_Frame_Buffer_structure ) 
...

错误...

  

严重性代码描述项目文件行抑制状态   错误BC30518重载解析失败,因为没有可访问的“新建”   可以使用以下参数调用:       '公共重载子新建(从ThreadStart开始)':方法'公共子frame_buffer_write_Thread(由ByRefenna_frame_buffer作为   Embedded_Communication_Interface.Antenna_Frame_Buffer_structure)'   没有与委托'Delegate Sub兼容的签名   ThreadStart()'。       'Public重载Sub New(从ParameterizedThreadStart开始)':方法'Public Sub frame_buffer_write_Thread(ByRef   enna_frame_buffer为   Embedded_Communication_Interface.Antenna_Frame_Buffer_structure)'   没有与委托'Delegate Sub兼容的签名   ParameterizedThreadStart(obj As Object)'。 SYS HUB和HW   GUI C:\ PRIMARY \ WORK \ SYSTEM   HUB \ SOURCE \ Embedded_Communication_Interface.vb 1030有效

2 个答案:

答案 0 :(得分:0)

不能。无论如何,您实际上并没有直接调用该方法,因此如何使用ByRef参数呢?您正在调用Thread.Start方法,但它没有ByRef参数,因此无法以这种方式获取值。甚至忽略了Thread.Start立即返回并且您不知道它调用的方法何时将返回的事实,因此无论如何您都不知道修改后的值何时可用。简而言之,ByRef参数在这种情况下没有意义,因此请勿尝试使用它们。

编辑:

创建线程时,您可以使用Lambda表达式将方法作为委托调用,然后可以使代码运行:

new_buffer_write_thread = New Thread(Sub() frame_buffer_write_Thread(antenna_frame_buffer))
new_buffer_write_thread.Start()

我不认为方法完成后会返回参数值到原始变量,如果这样做了,您将不知道何时执行此操作,因为您不知道方法何时完成,这就是为什么它根本不应该发生的原因。我认为LINQ创建了一个闭包,该闭包将原始变量屏蔽通过该参数进行的更改,即使它看起来像是要链接的一样。

答案 1 :(得分:0)

结构不能通过引用传递给线程。 但是,幸运的是,可以通过引用传递类的对象。