循环多线程调用方法,方法里的对象值获取不到
最近做一个小程序,循环生成Excel,当数据量大的时候,程序运行速度非常慢,所以客户要求改用多线程来实现生成Excel。我改进的代码如下:
''' <summary>
''' sdfをcsv変換する
''' </summary>
Private Sub SdfToCsv()
Dim confSheet As ConfigureSheet
Dim sheetCount, sheetFMT As Integer
Dim excelConfig, excelFMT As New ExcelLib
Dim dataLst As List(Of List(Of String))
Dim outFile As String = ""
Dim folder As String
Dim msg As String
Dim paras() As String
Dim changeFlg As Boolean = False
Dim i As Integer = 0
Try
'csvデータ削除
folder = IO.Path.Combine(AppPath, "csv")
Utility.DeleteFileFolder(folder)
'configure.xlsの読み込み
sheetCount = excelConfig.OpenExcel(txtConfig.Text, False, False)
sheetFMT = excelFMT.OpenExcel(eCRF_FMTFile, False, False)
If sheetCount = 0 OrElse sheetFMT = 0 Then
MessageLib.WriteRichTextBox(My.Resources.M025, MessageType.IsMessage, False, rtbMessage)
Exit Try
End If
'プログレスバー設定
Me.ProgressBar1.Maximum = sheetCount
Me.ProgressBar1.Value = 0
Me.ProgressBar1.Visible = True
For i = 1 To sheetCount
'キャンセル
If canceled = True Then
Me.ProgressBar1.Visible = False
Exit Try
End If
'シートの読み込み
confSheet = GetConfigure(excelConfig, i, outFile)
'エラー表示
If confSheet Is Nothing = False _
AndAlso confSheet.Errors.Count > 0 Then
For Each item As String In confSheet.Errors
MessageLib.WriteRichTextBox(item, MessageType.IsError, False, rtbMessage)
Next
Exit For
End If
'メッセージ出す
paras = {confSheet.Name}
msg = String.Format(My.Resources.M021, paras)
MessageLib.WriteRichTextBox(msg, MessageType.IsMessage, False, rtbMessage)
'' SDFファイルよりデータを取得する
'dataLst = GetDataFromSDF(excelFMT, confSheet)
''csvファイル作成
'If Utility.IsNull(dataLst) = False Then
' Call MakeFolder(folder)
' outFile = MakePathName(folder, outFile)
' Call Utility.WriteCsvColRemove(outFile, False, 1, confSheet.OutRecordNoColIndex, dataLst)
' 'プログレスバー設定
' Me.ProgressBar1.Value = i
' changeFlg = True
' 'メッセージ出す
' paras = {confSheet.Name}
' msg = String.Format(My.Resources.M022, paras)
' MessageLib.WriteRichTextBox(msg, MessageType.IsMessage, False, rtbMessage)
'Else
' 'メッセージ出す
' paras = {confSheet.Name}
' msg = String.Format(My.Resources.M023, paras)
' MessageLib.WriteRichTextBox(msg, MessageType.IsMessage, False, rtbMessage)
'End If
'主要实现代码是如下这部分
Dim thread As Thread = New Thread(New ThreadStart(
Sub()
' SDFファイルよりデータを取得する
'下面这一步获取数据时,GetDataFromSDF方法里有些对象的值总是获取不到
dataLst = GetDataFromSDF(excelFMT, confSheet)
'csvファイル作成
If Utility.IsNull(dataLst) = False Then
Call MakeFolder(folder)
outFile = MakePathName(folder, outFile)
Call Utility.WriteCsvColRemove(outFile, False, 1, confSheet.OutRecordNoColIndex, dataLst)
'プログレスバー設定
Me.ProgressBar1.Value = i
changeFlg = True
'メッセージ出す
paras = {confSheet.Name}
msg = String.Format(My.Resources.M022, paras)
MessageLib.WriteRichTextBox(msg, MessageType.IsMessage, False, rtbMessage)
Else
'メッセージ出す
paras = {confSheet.Name}
msg = String.Format(My.Resources.M023, paras)
MessageLib.WriteRichTextBox(msg, MessageType.IsMessage, False, rtbMessage)
End If
End Sub))
thread.Start()
thread.Join()
Next
'メッセージ出す
If changeFlg = True Then
MessageLib.WriteRichTextBox(My.Resources.M024, MessageType.IsMessage, False, rtbMessage)
End If
Me.ProgressBar1.Visible = False
Catch ex As Exception
Throw ex
Finally
excelConfig.CloseExcel()
excelFMT.CloseExcel()
excelConfig = Nothing
excelFMT = Nothing
End Try
End Sub
其中GetDataFromSDF方法里面又调用了很多其它类里的小方法,方法套方法,有些对象值总是获取不到,请高手帮忙解决,非常感谢!本人论坛积分不多,如果给分少了请谅解!谢谢
[解决办法]
看你这里面没有用到任何锁和同步机制,是否因为竞争冲突导致某些信息获取不到或错误
[解决办法]
我之前试过用SyLock和Monitor锁了线程中New ThreadStart()里的方法,但是是不行,难道这个方法中所有有关联的方法都要锁掉吗?
还有我想问一下,如果锁掉了,那么是不是只有等该线程执行完了之后才解锁給下一个线程使用?那要是这样的情况的话,这跟我之前用循环生成Excel不是没有区别了吗,用多线程就没有任何意义了。
我单纯的就是想利用多线程实现同步,生成Excel的时候,多个Excel同步生成,他们中间会调用共同的方法,调用共同的方法各干个的事儿,互不影响
这样要如何实现呢?在网上搜了好多资料都没有解决,东西很急,帮帮忙,非常感谢!
[解决办法]
我觉得是因为多线程之间有竞争冲突导致某些信息获取不到或错误,但是不知如何解决呢?
[解决办法]