按引用调用线程 (.Net)

Call thread by reference (.Net)

提问人: 提问时间:9/7/2021 更新时间:9/8/2021 访问量:67

问:

以下不起作用,因为 Is not an 因为它接收了它的参数。这意味着以下追加以调用具有值的线程的代码不起作用。Sub(ByRef t As T) ...Action(Of T)ByRefByRef

Public Sub UseLater(Of T As Structure)(ByRef t As T, m As Mutex, callback As [Delegate]) 'Includes ByRef Consumer
  m.WaitOne()
  m.ReleaseMutex()
  callback(t)
End Sub

''...

  Dim getterLock As New Mutex()
  Dim buffer As MyType = Nothing
  Dim threadhelper As [Delegate] = Sub(ByRef t As MyType) ''ISSUE: Action arg cannot be ByRef
                                     UseLater(Of MyType)(t, getterLock, Sub(ByRef t_ As MyType) buffer = t_)
                                   End Sub

  getterLock.WaitOne()
  Dim getLater As New Thread(threadhelper)
  getLater.Start(MyObject) ''Currently in scope object
  Dim getter As [Delegate] = Function() As MyType
                               getterLock.ReleaseMutex()
                               Return buffer
                             End Function

''getter can be passed out of scope

如何调用带有 ? (或者等价地从 getter 和 setter 那里获得?ByRefFunc(Of T)Action(Of T)ByRef

.NET vb.net 多线程 引用 传递

评论

0赞 Hursey 9/7/2021
所以我已经看了几个小时了,我可能不会很快给出确切的答案,但我真的很好奇你在这里的用例,你试图通过传递线程来解决的问题到底是什么?也许你可以用一些现实世界的背景来更新你的问题?
0赞 Craig 9/7/2021
我认为完成这项工作的唯一方法是将结构盒装入一个对象中。另请参阅此处的相关 C# 问题:stackoverflow.com/questions/1707310/...
0赞 9/7/2021
@Hursey,我试图使代码极简化。我试图创建一个结构,允许我在构造 lambda 时显式捕获 byref 并允许我编写详细的代码,例如: .AccessorSharedContainer(Of Accessor(Of T))
0赞 9/7/2021
@Craig我确实知道这个解决方案,但我的项目中有一个 Util 模块中的类,但这需要重写大量代码!使用隐式构造(通过转换)和属性,我可以有效地存储一个值 ByRef,从而最大限度地减少重写。SharedContainer

答: 暂无答案