首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

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

2012-12-14 
循环多线程调用方法,方法里的对象值获取不到最近做一个小程序,循环生成Excel,当数据量大的时候,程序运行速

循环多线程调用方法,方法里的对象值获取不到
最近做一个小程序,循环生成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,求助!

热点排行