读书人

循环多线程调用步骤方法里的对象值获

发布时间: 2012-12-14 10:33:08 作者: rapoo

循环多线程调用方法,方法里的对象值获取不到
最近做一个小程序,循环生成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同步生成,他们中间会调用共同的方法,调用共同的方法各干个的事儿,互不影响
这样要如何实现呢?在网上搜了好多资料都没有解决,东西很急,帮帮忙,非常感谢!
[解决办法]
我觉得是因为多线程之间有竞争冲突导致某些信息获取不到或错误,但是不知如何解决呢?
[解决办法]

引用:
看你这里面没有用到任何锁和同步机制,是否因为竞争冲突导致某些信息获取不到或错误

bdmh,求助!

读书人网 >VB Dotnet

热点推荐