Benutzer mit den meisten Antworten
Task mit mehreren Parametern füllen und starten

Frage
-
Hallo NG,
ich habe eine Prozedur, die sich rekursiv selbst aufruft. Der Durchlauf dieser Prozedur kann einige Zeit in Anspruch nehmen. Der Fortschritt des Prozesses wird über einen Event an eine Progressbar in einer anderen Form übermittelt. Der Vorgang funktioniert soweit. Um die Rechnerkapazität besser auszunutzen würde ich nun gerne mithilfe von Task´s die Prozedur in mehreren Threads gleichzeitig laufen lassen. Das habe ich jedoch bis jetzt nicht hinbekommen.
Ich bekomme die Übergabe der Parameter, die für die Rekursivität erforderlich sind, nicht hin. Ein weiteres Problem ist die Frage, wie erfahre ich, dass alle Task´s bearbeitet worden sind?
Public Sub GetAllReferentedDocumentsInventorDatei(ByVal FullDateiname As String, ByRef KatalogJN As Boolean, ByRef InventorDateiDI As Dictionary(Of String, InventorDatei)) Dim oAS As New Inventor.ApprenticeServerComponent Dim oAD As Inventor.ApprenticeServerDocument Dim oADC As Inventor.ApprenticeServerDocuments Dim DocDesEnum As Inventor.DocumentDescriptorsEnumerator Dim DocDes As Inventor.DocumentDescriptor Try RaiseEvent SetNextStep() If FileSystem.ExistsFile(FullDateiname) Then If Not InventorDateiDI.ContainsKey(FullDateiname) Then '### dieser Schritt braucht die meiste Zeit Dim InventorDatei As New InventorDatei(FullDateiname) '#################################################### InventorDateiDI.Add(FullDateiname, InventorDatei) RaiseEvent SetNextStep() End If oAD = oAS.Open(FullDateiname) RaiseEvent SetNextStep() oADC = oAD.AllReferencedDocuments RaiseEvent SetNextStep() DocDesEnum = oAD.ReferencedDocumentDescriptors If DocDesEnum.Count > 0 Then For Each DocDes In DocDesEnum RaiseEvent SetNextStep() If Not InventorDateiDI.ContainsKey(DocDes.FullDocumentName) Then Dim InventorDatei As New InventorDatei(DocDes.FullDocumentName) InventorDateiDI.Add(DocDes.FullDocumentName, InventorDatei) '?????????????????????????????????????????? Dim AufrufmitParameter As Action(Of Object, Object) = Sub(s As Object, s1 As Object) GetAllReferentedDocumentsInventorDatei(DocDes.FullDocumentName, DirectCast(s, Boolean), DirectCast(s1, Dictionary(Of String, InventorDatei))) End Sub Dim newThread1 As New Task(AufrufmitParameter, KatalogJN, InventorDateiDI) newThread1.Start() '????????????????????????????????????????????? '############################# 'Lösung die funktioniert, aber Zeit braucht 'GetAllReferentedDocumentsInventorDatei(DocDes.FullDocumentName, KatalogJN, InventorDateiDI) '############################# RaiseEvent SetNextStep() End If Next End If oAS.Close() End If Catch ex As Exception MessageBox.Show("GetAllReferentedDocumentsInventorDatei" & Chr(10) & ex.ToString, "Fehler 1062", MessageBoxButtons.OK) oAS.Close() End Try End Sub
Mit freundlichen Grüßen Dipl. Ing. Joachim Schmäck
Antworten
-
Hallo Joachim,
wie groß ist denn deine Hierarchie? Meine erste Idee wäre die Baumstruktur in eine Eindimensionale Liste zu verlagern (jeweils mit den nötigen Referenzen aus der Baumstruktur) und diese dann sequenziell abzuarbeiten.
Das befüllen der Liste kannst du erledigen, indem du in der Klasse die Liste anlegst und dann wieder per Rekursion ebendiese befüllst.Wenn du dann die Liste hast, dann kannst du beispielsweise mittels PLINQ die Abarbeitung machen. Dafür solltest du unbedingt die Artikel in PLINQ der MSDN durchlesen, da es bei paralleler Listenverarbeitung einiges zu beachten geht.
Alles in allem denke ich aber dass du damit am besten kommen wirst.
PS: Bedenke dass jeder UI-Zugriff extra-Leistung braucht. Auch der Zugriff auf gemeinsame Resourcen sollte geschickt synchronisiert werden. Eventuell lohnt es sich hier mehr mit Kopien zu arbeiten, sofern es nur ums lesen geht.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Bearbeitet Tom Lambert (Koopakiller)Moderator Samstag, 30. Juli 2016 21:57 PS
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 3. August 2016 10:43
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 9. August 2016 14:08
Alle Antworten
-
Hallo Joachim,
wie groß ist denn deine Hierarchie? Meine erste Idee wäre die Baumstruktur in eine Eindimensionale Liste zu verlagern (jeweils mit den nötigen Referenzen aus der Baumstruktur) und diese dann sequenziell abzuarbeiten.
Das befüllen der Liste kannst du erledigen, indem du in der Klasse die Liste anlegst und dann wieder per Rekursion ebendiese befüllst.Wenn du dann die Liste hast, dann kannst du beispielsweise mittels PLINQ die Abarbeitung machen. Dafür solltest du unbedingt die Artikel in PLINQ der MSDN durchlesen, da es bei paralleler Listenverarbeitung einiges zu beachten geht.
Alles in allem denke ich aber dass du damit am besten kommen wirst.
PS: Bedenke dass jeder UI-Zugriff extra-Leistung braucht. Auch der Zugriff auf gemeinsame Resourcen sollte geschickt synchronisiert werden. Eventuell lohnt es sich hier mehr mit Kopien zu arbeiten, sofern es nur ums lesen geht.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Bearbeitet Tom Lambert (Koopakiller)Moderator Samstag, 30. Juli 2016 21:57 PS
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 3. August 2016 10:43
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 9. August 2016 14:08
-
Hallo Tom,
danke für deinen Tipp. Ich habe mal in die Beschreibung zum Thema: PLINQ reingeschaut. Das trifft natürlich genau mein Problem. Ich suche jetzt mal nach Beispielen im Netz. Mit Beispielen komme ich besser zurecht, als mit der doch sehr abstrakten Erklärung auf der MSDN-Seite.
Mit freundlichen Grüßen Dipl. Ing. Joachim Schmäck