Vb.net 不允许在Lambda表达式中使用ByRef参数。解决方法没有为参数提供正确的状态
查看哪些引用,似乎无法将发送到调用子int的参数传递给Lambda表达式,因为它是ByRef参数 我创建了一个临时参数(实际上有两个-Lambda表达式中需要两个),并将其传递到长时间运行的任务中 这项任务执行得很好。它使用一个Vb.net 不允许在Lambda表达式中使用ByRef参数。解决方法没有为参数提供正确的状态,vb.net,lambda,persistence,pass-by-reference,byref,Vb.net,Lambda,Persistence,Pass By Reference,Byref,查看哪些引用,似乎无法将发送到调用子int的参数传递给Lambda表达式,因为它是ByRef参数 我创建了一个临时参数(实际上有两个-Lambda表达式中需要两个),并将其传递到长时间运行的任务中 这项任务执行得很好。它使用一个Parallel.ForEach表达式,该表达式以原始时间的30%运行 问题是在这个调用下面需要这两个ByRef参数 Parallel.ForEach将数百个值插入Excel。下面的语句应进行格式化,并使每个单元格都可以单击以打开包含其他信息的对话框窗口。格式化和可单击性
Parallel.ForEach
表达式,该表达式以原始时间的30%运行
问题是在这个调用下面需要这两个ByRef参数
Parallel.ForEach
将数百个值插入Excel。下面的语句应进行格式化,并使每个单元格都可以单击以打开包含其他信息的对话框窗口。格式化和可单击性都不起作用
下面是调用子签名、Lambda表达式和一些随后被调用的代码:
Friend Sub RefreshFormattingSummaryReport(ByRef oDPWorksheet As CDPWorksheet, ByRef oSheet As Microsoft.Office.Interop.Excel.Worksheet,
ByRef worker As BackgroundWorker)
Dim tempDPWorksheet As New CDPWorksheet
tempDPWorksheet = oDPWorksheet
Dim tempOsheet As New Microsoft.Office.Interop.Excel.Worksheet
tempOsheet = oSheet
Parallel.ForEach(rangeList,
Sub(singleTuple)
Dim iRow1 As Integer = 0
Dim iRow2 As Integer = 0
Dim iMaxRow As Integer = 0
Dim iCol1 As Integer = 0
Dim iCol2 As Integer = 0
Dim oRange As Range
Dim oRange2 As Range
Dim oCellValues() As String = Nothing
Dim oDesignSheet As Microsoft.Office.Interop.Excel.Worksheet
Dim bLoadFormulas As Boolean = False
Dim NamedRange = singleTuple.NamedRange
Dim NamedRangeRow = singleTuple.NamedRangeRow
Dim NamedRangeColumn = singleTuple.NamedRangeColumn
Dim NamedRangeCellValue = singleTuple.NamedRangeCellValue
If InStr(NamedRange, tempDPWorksheet.SheetID) > 0 Then
iRow1 = Integer.Parse(NamedRangeRow.ToString.Substring(0, IIf(InStr(NamedRangeRow, "-") > 0, InStr(NamedRangeRow, "-") - 1, Len(NamedRangeRow))))
iRow2 = Integer.Parse(NamedRangeRow.ToString.Substring(IIf(InStr(NamedRangeRow, "-") > 0, InStr(NamedRangeRow, "-"), 0), IIf(InStr(NamedRangeRow, "-") > 0, Len(NamedRangeRow) - InStr(NamedRangeRow, "-"), Len(NamedRangeRow))))
If iRow2 > iMaxRow Then iMaxRow = iRow2
If InStr(NamedRangeColumn, "DP_COL") > 0 Then
oRange = tempOsheet.Range(NamedRangeColumn)
iCol1 = oRange.Column
iCol2 = iCol1
oRange = Nothing
Else
iCol1 = Integer.Parse(NamedRangeColumn.ToString.Substring(0, IIf(InStr(NamedRangeColumn, "-") > 0, InStr(NamedRangeColumn, "-") - 1, Len(NamedRangeColumn))))
iCol2 = Integer.Parse(NamedRangeColumn.ToString.Substring(IIf(InStr(NamedRangeColumn, "-") > 0, InStr(NamedRangeColumn, "-"), 0), IIf(InStr(NamedRangeColumn, "-") > 0, Len(NamedRangeColumn) - InStr(NamedRangeColumn, "-"), Len(NamedRangeColumn))))
End If
oRange = CType(tempOsheet.Range(tempOsheet.Cells(iRow1, iCol1), tempOsheet.Cells(iRow2, iCol2)), Microsoft.Office.Interop.Excel.Range)
oCellValues = Split(Replace(Replace(Replace(Replace(Replace(Replace(NamedRangeCellValue, "{", ""), "}", ""), "&", "&"), "amp;", ""), "<", "<"), ">", ">"), ",| ")
If oRange IsNot Nothing Then
If oCellValues.Length = oRange.Rows.Count Then
For j = 1 To oRange.Rows.Count
Try
oRange2 = oRange.Cells.Item(j)
If oCellValues(j - 1).Length >= 2 Then
oRange2.Value = IIf(oCellValues(j - 1).Substring(0, 2).Equals(" "), oCellValues(j - 1), LTrim(oCellValues(j - 1)))
Else
oRange2.Value = oCellValues(j - 1)
End If
Catch ex As Exception
'MessageBox.Show(String.Format("Error: {0}", ex.Message, oRange.Cells.Item(j)))
End Try
Next
End If
End If
tempOsheet.Names.Add(Replace(NamedRange, tempDPWorksheet.SheetID & ".", "").Replace(" ", "_").Replace("-", "_").Replace(",", ""), oRange)
Try
If tempDPWorksheet.Columns.Contains(NamedRangeColumn) Then
bLoadFormulas = (tempDPWorksheet.Columns.IndexOf(NamedRangeColumn) <> -1) AndAlso (DirectCast(tempDPWorksheet.Columns(tempDPWorksheet.Columns.IndexOf(NamedRangeColumn)), CColumn).Type = EColumnTypes.Excel) Or NameIsExcelRow(NamedRange.ToString)
Else
bLoadFormulas = False
End If
If Not (InStr(NamedRange, "DP_FRO") > 0 Or InStr(NamedRange, "DRILLPOINT") > 0) Then
' ************** Repetitive Copy/Paste operations
RangeCopyDesignFormat(oRange, oDesignSheet.Range(Replace(NamedRange, tempDPWorksheet.SheetID & ".", "")), False, Not tempDPWorksheet.IncludeFormatting Or Not (Not (InStr(NamedRange, "SKIP") > 0) Or tempDPWorksheet.FormatSkipped), False, "", bLoadformulas:=bLoadFormulas, bLoadComments:=True)
End If
Catch ex As Exception
End Try
End If
End Sub)
oSheet = tempOsheet
oDPWorksheet = tempDPWorksheet
ReplaceKeywordsInHeaderAndFooter("", oDBInfo, oSheet, "", "", oProp.Value)
If oDPWorksheet.IncludeDrilldown Then
DrillDownLoad(oSheet, oDPWorksheet, oSmartTags, oDBInfo, "", 4 + iRowOffset)
End If
SuppressRows(oSheet, oDPWorksheet, oDBInfo, iMaxRow, iRowOffset:=iRowOffset)
If Not oDPWorksheet.DoNotAutofitColumns Then
tWidth = oSheet.Range("DP_FRO_" & oDPWorksheet.FROutlineID).ColumnWidth
oSheet.Range("DRILLPOINT").Columns.AutoFit()
oSheet.Range("DP_FRO_" & oDPWorksheet.FROutlineID).ColumnWidth = tWidth
End If
HideColumns(oSheet, oDPWorksheet.Columns, "DP_FRO_" & oDPWorksheet.FROutlineID, oDPWorksheet.HideFROColumn)
我已经尝试将临时变量分配回ByRef参数,并且还尝试使用临时名称更改Sub其余部分中ByRef参数的每个实例。两者都不起作用
有什么想法吗?非常感谢您的建议。哪些参数是ByRef?为什么它们是ByRef?你能显示方法签名吗?@ChrisDunaway-代码中添加了签名。工作表和工作表对象被传递给其他几个子系统,您似乎没有将新工作表重新分配给
oDPWorksheet
或oSheet
,我无法想象您会将新的后台工作表重新分配给worker
变量的场景。看起来这些变量根本不需要通过ByRef传递。也许这太过分了。这是~2005年的遗留代码。我将通过删除子调用中的所有ByRef来测试它。谢谢。删除了ByRef。好消息是,什么也没发生。糟糕的是,什么也没发生。仍然无法获得格式化或可单击性。我可能会重新评估并用不同的问题陈述提出问题。哪些参数是ByRef
?为什么它们是ByRef?你能显示方法签名吗?@ChrisDunaway-代码中添加了签名。工作表和工作表对象被传递给其他几个子系统,您似乎没有将新工作表重新分配给oDPWorksheet
或oSheet
,我无法想象您会将新的后台工作表重新分配给worker
变量的场景。看起来这些变量根本不需要通过ByRef传递。也许这太过分了。这是~2005年的遗留代码。我将通过删除子调用中的所有ByRef来测试它。谢谢。删除了ByRef。好消息是,什么也没发生。糟糕的是,什么也没发生。仍然无法获得格式化或可单击性。我可能会重新评估,并用不同的问题陈述提出问题。