【问题标题】:VB.NET 4.0 Parallel.ForEach AddressOf Multiple Values?VB.NET 4.0 Parallel.ForEach AddressOf 多个值?
【发布时间】:2011-11-05 00:46:54
【问题描述】:

我正在尝试从 Delegates 更改为 Parallel.ForEach

我看到下面的工作正常。

Imports System.Threading.Tasks

  Sub Main()
   Dim secs() As Integer = {2, 3, 1}
   Parallel.ForEach(secs, AddressOf Method2)
  End Sub

  Sub Method2(ByVal i As Integer)
   Console.WriteLine(i.ToString)
  End Sub

但是如果我的 Sub 需要多个变量怎么办?你能告诉我应该怎么做吗?

Imports System.Threading.Tasks
  Sub Main()
   Dim secs() As Integer = {2, 3, 1}
   Dim Path as String = "Constant"

   Parallel.ForEach(secs, Path, AddressOf Method2)
  End Sub

 Sub Method2(ByVal i As Integer, path as string )
  Console.WriteLine(i.ToString, path)
 End Sub

谢谢

【问题讨论】:

    标签: vb.net .net-4.0 parallel-extensions


    【解决方案1】:

    您可以通过Lambda Expression

    Imports System.Threading.Tasks
      Sub Main()
       Dim secs() As Integer = {2, 3, 1}
       Dim Path as String = "Constant"
    
       Parallel.ForEach(secs, Sub(sec) Method2(sec, Path))
      End Sub
    
     Sub Method2(ByVal i As Integer, path as string)
      Console.WriteLine(i.ToString(), path)
     End Sub
    

    这将允许编译器创建一个获取 Path 值的闭包,并将其直接传递给您的方法。

    【讨论】:

    • 谢谢,我还要再等 3 分钟才能添加答案。但我确实收到了与 Sub 相同的警告
    • @Jasin 该警告是 Visual Studio 警告还是 Resharper/3rd 方工具警告?我怀疑这是一个错误的警告......
    • VS 2010 Pro,我很乐意忽略它,只是确保。
    • @Jasin 我上面的代码,与输入的完全相同,在 Visual Studio 2010 中没有给出警告......(并且它工作正常)。您是否安装了 Resharper 或任何扩展程序?
    • 生产力电动工具,拼写检查器。 - 也许您认为 Path 实际上来自 Paths 中的 ForEach 是否重要? - 我的代码比上面更复杂,只是想把这部分弄好。
    【解决方案2】:

    当然,在 C# 中,我会使用 lambda 表达式来调用 Method2

    Parallel.ForEach(secs, i => Method2(i, path));
    

    等价物在 VB 中是否看起来很优雅超出了我对我在上午 12.50 时不使用的语言的良好判断,但你真的没有很多其他选择 - 假设你没有想要创建另一个类的实例,将path 传递给构造函数,然后在该类中使用单参数方法...

    (哦,另一种选择是将Method2 更改为单个参数方法,其中参数封装了两个值。所以我猜你确实有一些选择 - 但至少在 C# 中, lambda 表达式之一将是要走的路。)

    【讨论】:

    • 我将其转换为 Parallel.ForEach(Directories, Function(i) ScanDirectory(i, Path)) 并收到此警告(在 lambda 表达式中使用迭代变量可能会产生意外结果。相反,创建循环中的局部变量,并将迭代变量的值分配给它。)想法?
    • @Jasin 我的回答在 VB 中显示了正确的语法 - 你需要 Sub(i),而不是 Function(i)
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多