Hallo zusammen,
ich habe eine Frage. Ich habe mir einen Code geschrieben mit dem ich parallel Excel Dateien auslesen kann. Diese Werte schreibe ich in ein Array und will dieses später in eine Excel Datei schreiben. Ich habe leider keine Idee wie ich am Ende des Threadpools auf den letzten noch lesenden Thread warte.
Hier mein Code
ich habe eine Frage. Ich habe mir einen Code geschrieben mit dem ich parallel Excel Dateien auslesen kann. Diese Werte schreibe ich in ein Array und will dieses später in eine Excel Datei schreiben. Ich habe leider keine Idee wie ich am Ende des Threadpools auf den letzten noch lesenden Thread warte.
Hier mein Code
Quellcode
- Imports System.Threading
- Imports Microsoft.Office.Interop.Excel
- Imports Microsoft.VisualBasic.FileIO
- Imports Microsoft.VisualBasic.FileIO.FileSystem
- Module Module1
- '##################################################################################################################################################
- 'Alle Anpassungen der Variablen hier:
- Dim Dateipfad As String = "\\Eigene Dokumente\xls Test Dateien"
- Dim DateipfadAusgabe As String = "\\Eigene Dokumente\Test_File.xls"
- Dim DokumentenfeldAuslesen As String = "B1"
- Dim WorksheetNr As Integer = 1
- Dim Stackgroesse As Integer = 100
- '##################################################################################################################################################
- 'Deklaration Excel Mappe
- Dim oExcel As Microsoft.Office.Interop.Excel.Application
- Dim oBook As Microsoft.Office.Interop.Excel.Workbook
- Dim oSheet As Microsoft.Office.Interop.Excel.Worksheet
- 'Initialisiert eine neue Instanz der Semaphore-Klasse, gibt die maximale Anzahl gleichzeitiger Einträge an und reserviert optional einige Einträge.
- 'Semaphore(initialCount, maximumCount)
- 'initialCount: Die anfängliche Anzahl von Anforderungen für das Semaphor, die gleichzeitig gewährt werden können (Int32).
- 'maximumCount: Die maximale Anzahl von Anforderungen für das Semaphor, die gleichzeitig gewährt werden können (Int32).
- Dim sem As New Semaphore(1, 1)
- 'Stack erstellen
- Dim meinStack As New Stack(Stackgroesse)
- 'Variablen Deklaration incl. Dateipfad
- Dim Dokumentennummer As Integer
- Dim DateiCounter As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = My.Computer.FileSystem.GetFiles(Dateipfad)
- Dim meinArray(DateiCounter.Count - 1, 1)
- Dim AnzahlThreads As Integer = 0
- 'Hautroutine
- 'Verzeichnis wird durchsucht und Dateipfade werden aufden Stack geschrieben
- Sub Main()
- For Each File As String In System.IO.Directory.GetFiles(Dateipfad)
- meinStack.Push(File)
- Next
- Console.WriteLine("Stack ist mit {0} Dokumentenpfaden gefüllt", meinStack.Count)
- 'Verbrauchroutine starten
- Verbraucher()
- End Sub
- 'In Verbraucher Sub Thread-Pool erzeugen
- Sub Verbraucher()
- While meinStack.Count <> 0
- ThreadPool.QueueUserWorkItem(AddressOf LeseDateiAus, AnzahlThreads)
- End While
- oExcel = New Microsoft.Office.Interop.Excel.Application
- oExcel.Visible = False
- oBook = oExcel.Workbooks.Add
- oSheet = oBook.Worksheets(1)
- oSheet.Range("A1").Value = "Dokumentennummer"
- oSheet.Range("B1").Value = "Pfad der Datei"
- oSheet.Range("A2").Resize(DateiCounter, 2).Value = meinArray
- oBook.SaveAs(DateipfadAusgabe)
- oBook.Close()
- oExcel.Quit()
- End Sub
- 'Threadsichere Sub
- Sub LeseDateiAus(ByVal state As Object)
- Console.WriteLine("Thread {0} tritt in das Semaphore ein", Thread.CurrentThread.ManagedThreadId)
- sem.WaitOne()
- Try
- oExcel = New Microsoft.Office.Interop.Excel.Application
- oExcel.Visible = False
- If meinStack.Count = 0 Then Exit Try
- oBook = oExcel.Workbooks.Open(meinStack.Pop, , True)
- oSheet = oBook.Worksheets(WorksheetNr)
- Dokumentennummer = oSheet.Range(DokumentenfeldAuslesen).Value
- oBook.Close()
- oExcel.Quit()
- Console.WriteLine(Dokumentennummer)
- meinArray(meinStack.Count, 0) = Dokumentennummer
- meinArray(meinStack.Count, 1) = meinStack.Pop
- Finally
- sem.Release()
- End Try
- Console.WriteLine("Thread {0} tritt aus dem Semaphore aus", Thread.CurrentThread.ManagedThreadId)
- End Sub
- End Module