2013-01-14 5 views
3

저는 백그라운드 작업자 제어 기능이 새로 도입되었습니다. 파일을 빌드하는 기존 프로젝트가 있지만 프로젝트를 빌드하는 동안 교착 상태 오류가 발생합니다. 배경 작업자만으로 구성된 다른 프로젝트를 만들어 문제를 해결하려고합니다. 나는 그들을 합칠 것이다.배경 작업자 및 SaveDialog

내 문제는 내 배경 작업자가 어디에 구현되어야하는지 잘 모르겠지만 주요 문제는 내 백그라운드 작업자와 함께 SaveDialog를 어떻게 사용할 수 있는가하는 것입니다. 완료 될 때 내 파일이 빌드 될 때이를 알려주는 매개 변수를 내 백그라운드 작업자 프로젝트에 보내야합니다. 당신이 시도 할 수

srOutputFile = New System.IO.StreamWriter(strFile, False) 'Create File 

    For iSeqNo = 0 To iPrintSeqNo 
    ' Loop through al the record types 
    For Each oRecord As stFileRecord In pFileFormat 
     If dsFile.Tables.Contains(oRecord.strRecordName) Then 
     ' Loop through al the records 
     For Each row As DataRow In dsFile.Tables(oRecord.strRecordName).Rows 
      ' Check record id 
      If oRecord.strRecordId.Length = 0 Then 
      bMatched = True 
      Else 
      bMatched = (CInt(oRecord.strRecordId) = CInt(row.Item(1))) 
      End If 

      ' Match records 
      If iSeqNo = CInt(row.Item(0)) And bMatched Then 
      strRecord = "" 
      ' Loop through al the fields 
      For iLoop = 0 To UBound(oRecord.stField) 
       ' Format field 
       If oRecord.stField(iLoop).iFieldLength = -1 Then 
       If strRecord.Length = 0 Then 
        strTmp = row.Item(iLoop + 1).ToString 
       Else 
        strTmp = strDelimiter & row.Item(iLoop + 1).ToString 
       End If 
       ElseIf oRecord.stField(iLoop).eFieldType = enumFieldType.TYPE_VALUE Or _ 
        oRecord.stField(iLoop).eFieldType = enumFieldType.TYPE_AMOUNT_CENT Then 

       strTmp = row.Item(iLoop + 1).ToString.Replace(".", "").PadLeft(oRecord.stField(iLoop).iFieldLength, "0") 
       strTmp = strTmp.Substring(strTmp.Length - oRecord.stField(iLoop).iFieldLength) 
       Else 
       strTmp = row.Item(iLoop + 1).ToString.PadRight(oRecord.stField(iLoop).iFieldLength, " ").Substring(0, oRecord.stField(iLoop).iFieldLength) 
       End If 

       If oRecord.stField(iLoop).iFieldLength > -1 And (bForceDelimiter) And strRecord.Length > 0 Then 
       strTmp = strDelimiter & strTmp 
       End If 

       strRecord = strRecord & strTmp 
      Next 

      ' Final delimiter 
      If (bForceDelimiter) Then 
       strRecord = strRecord & strDelimiter 
      End If 

      srOutputFile.WriteLine(strRecord) 
      End If 
     Next 
     End If 
    Next 
    Next 

답변

1

:

Private locker1 As ManualResetEvent = New System.Threading.ManualResetEvent(False) 
Private locker2 As ManualResetEvent = New System.Threading.ManualResetEvent(False) 
Dim bOpenFileOK As Boolean 
Dim myOpenFile As OpenFileDialog = New OpenFileDialog() 

Private Sub FileOpener() 
    While Not bTerminado 
     If myOpenFile.ShowDialog() = System.Windows.Forms.DialogResult.OK Then 
      bOpenFileOK = True 
     Else 
      bOpenFileOK = False 
     End If 

     locker2.Set() 
     locker1.WaitOne() 
    End While 
End Sub 

' Detonator of the action 
Private Sub Button1_Click(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles Button1.Click 
    Dim tFileOp As Thread = New Thread(AddressOf FileOpener) 
    tFileOp.SetApartmentState(ApartmentState.STA) 
    tFileOp.Start() 

    ' Start BackgroundWorker 
    BW1.RunWorkerAsync() 
End Sub 

Private Sub AsyncFunctionForBW(ByVal args As ArrayList) 
    '[...] 

    'Change options dinamically for the OpenFileDialog 
    myOpenFile.Filter = "" 
    myOpenFile.MultiSelect = True 

    'Calling the FileDialog 
    locker1.Set() 
    locker2.WaitOne() 
    locker1.Reset() 
    locker2.Reset() 

    If bOpenFileOK Then 
     myStream = myOpenFile.OpenFile() 

     '[...] 
    End If 
End Sub 

그것은 복잡한 조금입니다 만 작동 내 파일이 빌드중인 위치

이입니다.

ManualResetEvents.Set()을 사용할 때까지 코드 실행을 중단합니다 (중단하라는 메시지가 표시되는 경우). .WaitOne()을 사용하는 경우 정지 모드에서 설정하므로 도달하면 다시 중지됩니다.

이 코드는 두 개의 ManualResetEvents을 정의합니다. Button1을 누르면 FileOpener() 함수가 새로 시작되고 Thread이 시작되고 BackgroundWorker이 시작됩니다. FileOpener() 함수는 FileOpenDialog을 표시하고 locker1에서 대기하므로 locker1.Set()을 사용할 때 함수는 파일 대화 상자를 표시합니다.

이 "글로벌"변수 (bOpenFileOK) 일 때 사용자가 파일을 선택하거나 선택하지 않으면 대화 상자 결과 (bOpenFileOK)와 선택한 파일을 감지 할 수 있습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 내가 스레드와 백그라운드 작업자로 새롭기 때문에 당신이하고있는 일을 간단히 설명 할 수 있을까요? 당신이하는 일을 완전히 이해하고 싶습니다. – Gericke

+0

@ G-Man 나는 코드가하는 일을 명확히하기 위해 더 많은 코멘트를 가지고 나의 대답을 편집하고있다. – SysDragon

+0

@ G-Man 완료. 당신이 아무것도 이해하지 못하면 그냥 물어보십시오. 미안하지만 내 설명이 명확하지 않다면. – SysDragon