在任务中使用 SqlConnection - 'ByRef' 参数 'cnn' 不能在 lambda 表达式中使用

Using SqlConnection in tasks - 'ByRef' parameter 'cnn' cannot be used in a lambda expression

我需要 运行 一些传递 SqlConnection 的任务(由于事务状态)。

这是我的代码:

Public Class CustomerModel
    Public Property Name As String
End Class


Public Shared Function GetData(ByRef cnn As SqlConnection, zipCodes As List(Of String)) As String
    Dim tasks As Task(Of CustomerModel)() = New Task(Of CustomerModel)(zipCodes.Count - 1) {}
    Dim i As Integer = 0
    For Each zipCode As String In zipCodes
        tasks(i) = Task.Run(Of CustomerModel)(Function() (GetCustomer(cnn)))
        i += 1
    Next
    Task.WaitAll(tasks)
End Function


Private Shared Function GetCustomer(ByRef cnn As SqlConnection) As CustomerModel
End Function

但是我得到这个错误:

'ByRef' parameter 'cnn' cannot be used in a lambda expression.

这是不可能的吗?我该如何解决?

感谢

在 Sub 或函数中声明的 lambda 表达式不能使用该 Sub 或函数的任何 ByRef 参数。例如下面的代码会导致这个错误,因为lambda表达式中使用了ByRef参数n。

更正错误,将ByRef参数赋值给局部变量,并在lambda表达式中使用局部变量,如下代码所示:

Public Shared Function GetData(ByRef cnn As SqlConnection, zipCodes As List(Of String)) As String
    Dim tasks As Task(Of CustomerModel)() = New Task(Of CustomerModel)(zipCodes.Count - 1) {}
    Dim conn as SqlConnection = cnn
    Dim i As Integer = 0
    For Each zipCode As String In zipCodes
        tasks(i) = Task.Run(Of CustomerModel)(Function() (GetCustomer(conn)))
        i += 1
    Next
    Task.WaitAll(tasks)
End Function

参考

https://msdn.microsoft.com/en-us/library/bb531324(v=vs.90).aspx

干脆不要使用ByRef。无论如何,您都没有写入参数 cnn,因此没有必要使用 ByRef。也许您不知道在 .NET 中引用类型总是通过引用传递...

试试这个:

Public Class CustomerModel
    Public Property Name As String
End Class

Public Shared Function GetData(cnn As SqlConnection, zipCodes As List(Of String)) As String
    Task.WaitAll(zipCodes.Select(Function(z) Task.Run(Function() GetCustomer(cnn))).ToArray)
End Function

Private Shared Function GetCustomer(cnn As SqlConnection) As CustomerModel
    '
End Function