如何在VB中编写这个匿名C#方法?
我需要为生成多个后台线程(我的测试库包含6008个零件号,单个线程将从公司数据库中查找每个零件的条形码和描述) 我从这篇文章中得到了一些想法: 我对尝试不使用WaitHandle的答案感兴趣(因为它有64个线程的限制),但我不知道如何在这个VB应用程序中复制他的答案:如何在VB中编写这个匿名C#方法?,c#,vb.net,multithreading,asynchronous,c#-to-vb.net,C#,Vb.net,Multithreading,Asynchronous,C# To Vb.net,我需要为生成多个后台线程(我的测试库包含6008个零件号,单个线程将从公司数据库中查找每个零件的条形码和描述) 我从这篇文章中得到了一些想法: 我对尝试不使用WaitHandle的答案感兴趣(因为它有64个线程的限制),但我不知道如何在这个VB应用程序中复制他的答案: public static void SpawnAndWait(IEnumerable<Action> actions) { var list = actions.ToList(); var handl
public static void SpawnAndWait(IEnumerable<Action> actions)
{
var list = actions.ToList();
var handles = new ManualResetEvent[actions.Count()];
for (var i = 0; i < list.Count; i++)
{
handles[i] = new ManualResetEvent(false);
var currentAction = list[i];
var currentHandle = handles[i];
Action wrappedAction = () => { try { currentAction(); } finally { currentHandle.Set(); } };
ThreadPool.QueueUserWorkItem(x => wrappedAction());
}
WaitHandle.WaitAll(handles);
}
不,它不编译
x
不相关,因为它没有被使用,所以您可以使用Sub()wrappedAction()
这样做应该可以:
Public Shared Sub SpawnAndWait(ByVal actions As IEnumerable(Of Action))
Dim list = actions.ToList()
Dim [handles] = New ManualResetEvent(actions.Count() - 1){}
For i = 0 To list.Count - 1
[handles](i) = New ManualResetEvent(False)
Dim currentAction = list(i)
Dim currentHandle = [handles](i)
Dim wrappedAction As Action = Sub()
Try
currentAction()
Finally
currentHandle.Set()
End Try
End Sub
ThreadPool.QueueUserWorkItem(Sub(x) wrappedAction())
Next i
WaitHandle.WaitAll([handles])
End Sub
x=>wrappedAction()将如何在VB中编写
虽然x
不相关,因为它没有被使用,所以您可以使用Sub()wrappedAction()
这样做应该可以:
Public Shared Sub SpawnAndWait(ByVal actions As IEnumerable(Of Action))
Dim list = actions.ToList()
Dim [handles] = New ManualResetEvent(actions.Count() - 1){}
For i = 0 To list.Count - 1
[handles](i) = New ManualResetEvent(False)
Dim currentAction = list(i)
Dim currentHandle = [handles](i)
Dim wrappedAction As Action = Sub()
Try
currentAction()
Finally
currentHandle.Set()
End Try
End Sub
ThreadPool.QueueUserWorkItem(Sub(x) wrappedAction())
Next i
WaitHandle.WaitAll([handles])
End Sub
委托被定义为
_
公共委托子WaitCallback(状态为对象)
因此正确的语法应该是:
ThreadPool.QueueUserWorkItem(子(状态为对象)wrappedAction())
ThreadPool.QueueUserWorkItem(子(状态为对象)作业())
ThreadPool.QueueUserWorkItem(子(状态为对象)作业.Invoke())
ThreadPool.QueueUserWorkItem(子(状态为对象)作业())
该委托被定义为
_
公共委托子WaitCallback(状态为对象)
因此正确的语法应该是:
ThreadPool.QueueUserWorkItem(子(状态为对象)wrappedAction())
ThreadPool.QueueUserWorkItem(子(状态为对象)作业())
ThreadPool.QueueUserWorkItem(子(状态为对象)作业.Invoke())
ThreadPool.QueueUserWorkItem(子(状态为对象)作业())
获取C代码,编译它,然后运行汇编程序,选择VB作为输出语言,我得到:
Public Shared Sub SpawnAndWait(ByVal actions As IEnumerable(Of System.Action))
Dim list As List(Of System.Action) = actions.ToList(Of System.Action)()
Dim handles(actions.Count(Of System.Action)()) As System.Threading.ManualResetEvent
Dim i As Integer = 0
While i < list.Count
handles(i) = New System.Threading.ManualResetEvent(False)
Dim item As System.Action = list(i)
Dim manualResetEvent As System.Threading.ManualResetEvent = handles(i)
Dim action As System.Action = Sub()
Try
item()
Finally
manualResetEvent.[Set]()
End Try
End Sub
ThreadPool.QueueUserWorkItem(Sub(x As Object) action())
i = i + 1
End While
WaitHandle.WaitAll(handles)
End Sub
公共共享子spawandwait(ByVal操作作为IEnumerable(属于System.Action))
Dim list As list(Of System.Action)=actions.ToList(Of System.Action)()
Dim句柄(actions.Count(Of System.Action)()作为System.Threading.ManualResetEvent
尺寸i为整数=0
当我数的时候
句柄(i)=新系统。线程。手动重置事件(False)
作为系统的Dim项目。操作=列表(i)
Dim manualResetEvent作为System.Threading.manualResetEvent=手柄(i)
Dim操作作为System.action=Sub()
尝试
项目(
最后
手动重置事件。[设置]()
结束尝试
端接头
ThreadPool.QueueUserWorkItem(Sub(x作为对象)操作())
i=i+1
结束时
WaitHandle.WaitAll(句柄)
端接头
获取C代码,编译它,然后运行汇编程序,选择VB作为输出语言,我得到:
Public Shared Sub SpawnAndWait(ByVal actions As IEnumerable(Of System.Action))
Dim list As List(Of System.Action) = actions.ToList(Of System.Action)()
Dim handles(actions.Count(Of System.Action)()) As System.Threading.ManualResetEvent
Dim i As Integer = 0
While i < list.Count
handles(i) = New System.Threading.ManualResetEvent(False)
Dim item As System.Action = list(i)
Dim manualResetEvent As System.Threading.ManualResetEvent = handles(i)
Dim action As System.Action = Sub()
Try
item()
Finally
manualResetEvent.[Set]()
End Try
End Sub
ThreadPool.QueueUserWorkItem(Sub(x As Object) action())
i = i + 1
End While
WaitHandle.WaitAll(handles)
End Sub
公共共享子spawandwait(ByVal操作作为IEnumerable(属于System.Action))
Dim list As list(Of System.Action)=actions.ToList(Of System.Action)()
Dim句柄(actions.Count(Of System.Action)()作为System.Threading.ManualResetEvent
尺寸i为整数=0
当我数的时候
句柄(i)=新系统。线程。手动重置事件(False)
作为系统的Dim项目。操作=列表(i)
Dim manualResetEvent作为System.Threading.manualResetEvent=手柄(i)
Dim操作作为System.action=Sub()
尝试
项目(
最后
手动重置事件。[设置]()
结束尝试
端接头
ThreadPool.QueueUserWorkItem(Sub(x作为对象)操作())
i=i+1
结束时
WaitHandle.WaitAll(句柄)
端接头
您是否考虑过让程序员来处理线程细节?我不擅长用我喜欢的C语言来处理这些事情。你能告诉我如何在VB中实现吗?至于语法,我很确定c的翻译更像是ThreadPool.QueueUserWorkItem(Function(x)job())
在job()下仍然显示蠕动
with Expression不会产生值您是否考虑过让函数处理线程细节?我不擅长用我喜欢的C语言来处理这些内容。你能告诉我如何在VB中实现吗?至于语法,我很确定c的翻译更像是ThreadPool。QueueUserWorkItem(Function(x)job())
仍然在job()
下显示蠕动,而表达式不会产生一个独特的处理方法的值,而且它也能工作!:)事实上,在代码中有几个错误,你可能想在反编译中提到:1。除非用方括号和2括起来,否则不能将“句柄”用作标识符。“handles”上的数组说明符需要减少1,因为VB数组是使用上限而不是大小来声明的(这对于反编译器来说是一个严重错误)。这是一种处理它的独特方法,而且也很有效:)事实上,在代码中有几个错误,你可能想在反编译中提到:1。除非用方括号和2括起来,否则不能将“句柄”用作标识符。“handles”上的数组说明符需要减少1,因为VB数组是使用上限而不是大小声明的(这对于反编译器来说是一个严重错误)。