如何在VB中编写这个匿名C#方法?

如何在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

我需要为生成多个后台线程(我的测试库包含6008个零件号,单个线程将从公司数据库中查找每个零件的条形码和描述)

我从这篇文章中得到了一些想法:

我对尝试不使用WaitHandle的答案感兴趣(因为它有64个线程的限制),但我不知道如何在这个VB应用程序中复制他的答案:

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);
}
不,它不编译

  • 表达式不产生值
  • 表达式不产生值
  • “System.Action”类型的值无法转换为“System.Threading.WaitCallback”
  • 这个项目编译成.NET4.0,所以我不能真正使用4.5Await特性,除非插件被授权用于公司项目

    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
    
    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数组是使用上限而不是大小声明的(这对于反编译器来说是一个严重错误)。