Datagridview.Refresh löst mit Backroundworker fehler aus.

  • WPF

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von GOKTerek.

    Datagridview.Refresh löst mit Backroundworker fehler aus.

    Hallo Gemeinde,

    mall wieder ein Anfänger Problem im WPF. Aktuell habe ich eine Page(002) die im MainWindow(001) in einem Frame dargestellt wird.
    Auf der Page(002) ist eine Datagridview die über eine Dataview mit einer Datatable gebunden ist.

    Der Prozess startet einen Backroundworker, der einen langwierigen Automatisierten Prozess abarbeitet und die Datatable mit Daten füllt.
    Wenn ich nun die die Größe des MainWindow(001) ändere, die srollleisten des DGV verschiebe, oder sonstige äderungen mache, bekomme ich eine Fehlermeldung "Das DGV ist nicht Konsestent und die menge der enthaltenen Daten stimmt nicht überein.".

    Wie kann ich ein absturz meines Programms verhindern(Bei Windows Forms hatte ich das Problem nie)?

    Anbei der Prozess Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Data
    3. Imports System.ComponentModel
    4. Imports SolidWorks.Interop
    5. Imports SolidWorks.Interop.swcommands
    6. Imports SolidWorks.Interop.swconst
    7. Public Class Main_Instance
    8. Dim Assembly_Check_Property As Boolean = True
    9. Dim Part_Check_Property As Boolean = True
    10. Dim WorkingTable_Property As DataTable
    11. Dim FileDictionary_Property As Dictionary(Of String, List(Of String))
    12. Protected Friend WorkingFrame As System.Windows.Controls.Frame
    13. Protected Friend WithEvents CFC_SQL_Functions As New CFC_SQL_Functions(Me)
    14. Protected Friend Returning_Admin_Page As Admin_Page
    15. Private SWFunc_Main_Instance As New SW_Functions_001.Main_Instance
    16. Private SW_App_Functions As New SW_Functions_001.SW_Application(SWFunc_Main_Instance)
    17. Private SW_Configuration_Functions As New SW_Functions_001.SW_ConfigurationFunctions(SWFunc_Main_Instance)
    18. Private SW_CustomProberty_Functions As New SW_Functions_001.SW_CustomProbertyFunctions(SWFunc_Main_Instance)
    19. Public ReadOnly UserLoginName As String = System.Environment.UserName
    20. Public WithEvents MainBackWorker As New BackgroundWorker With {.WorkerReportsProgress = True, .WorkerSupportsCancellation = True}
    21. Public Event ReportProgress(ByVal Counter As Integer)
    22. Public Event WorkDone()
    23. Public Event UpdateTable()
    24. Public Property Assembly_Check As Boolean
    25. Get
    26. Return Assembly_Check_Property
    27. End Get
    28. Set(value As Boolean)
    29. Assembly_Check_Property = value
    30. End Set
    31. End Property
    32. Public Property Part_Check As Boolean
    33. Get
    34. Return Part_Check_Property
    35. End Get
    36. Set(value As Boolean)
    37. Part_Check_Property = value
    38. End Set
    39. End Property
    40. Public Property WorkingTable As DataTable
    41. Get
    42. If WorkingTable_Property Is Nothing Then
    43. WorkingTable_Property = CFC_SQL_Functions.LoadWorkingTable
    44. End If
    45. Return WorkingTable_Property
    46. End Get
    47. Set(ByVal Value As DataTable)
    48. WorkingTable_Property = Value
    49. End Set
    50. End Property
    51. Public Property FileDictionary As Dictionary(Of String, List(Of String))
    52. Get
    53. Return FileDictionary_Property
    54. End Get
    55. Set(value As Dictionary(Of String, List(Of String)))
    56. FileDictionary_Property = value
    57. End Set
    58. End Property
    59. Public Sub New(Optional ByVal CheckAssemblys As Boolean = True, Optional ByVal CheckParts As Boolean = True)
    60. Assembly_Check = CheckAssemblys
    61. Part_Check = CheckParts
    62. AddHandler MainBackWorker.DoWork, AddressOf CheckFailureConfiguration
    63. AddHandler MainBackWorker.RunWorkerCompleted, AddressOf MainBackWorkerCompletet
    64. AddHandler MainBackWorker.ProgressChanged, AddressOf MainBackWorkerProgressChanged
    65. End Sub
    66. Public Sub StartFunctionsWithPage(ByVal ViewingFrame As System.Windows.Controls.Frame)
    67. Returning_Admin_Page = New Admin_Page(Me)
    68. WorkingFrame = ViewingFrame
    69. ViewingFrame.Navigate(Returning_Admin_Page)
    70. End Sub
    71. Public Sub StartFolderWork()
    72. MainBackWorker.RunWorkerAsync()
    73. End Sub
    74. Public Sub CancelBCKWorker()
    75. MainBackWorker.CancelAsync()
    76. End Sub
    77. Private Sub CheckFailureConfiguration(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
    78. Dim i As Integer = 0
    79. Dim swApp As sldworks.ISldWorks = SWFunc_Main_Instance.swApp
    80. For Each WorkingKey As KeyValuePair(Of String, List(Of String)) In FileDictionary
    81. i += 1
    82. Dim Percent As Integer = CInt((100 / FileDictionary.Count) * i)
    83. Dim swModelDoc As sldworks.IModelDoc2 = SW_App_Functions.OpenModelDoc(WorkingKey.Key)
    84. If Not swModelDoc Is Nothing Then
    85. Dim ConfigurationsList As List(Of String) = SW_Configuration_Functions.GetAllMainConfigurationNames(swModelDoc)
    86. Dim ModelCreatedby As String = ""
    87. Dim CreationDate As String = ""
    88. Dim FileName As New System.IO.FileInfo(WorkingKey.Key)
    89. If ConfigurationsList.Count >= 2 Then
    90. Dim Model_DS As DataSet = New CheckFailureConfiguration_DTS
    91. Model_DS.Clear()
    92. For Each ConfigName As String In ConfigurationsList
    93. swModelDoc.ShowConfiguration2(ConfigName)
    94. Model_DS.Tables.Add(CheckFailureConfiguration_DTS.CreateNewConfigTable(ConfigName))
    95. FeatureCheck(swModelDoc, Model_DS.Tables(ConfigName), FileName.Name)
    96. If ModelCreatedby = "" Then
    97. ModelCreatedby = SW_CustomProberty_Functions.GetFieldValues(swModelDoc, "STD_Erstellt_von")
    98. Else
    99. ModelCreatedby = ModelCreatedby & "__" & SW_CustomProberty_Functions.GetFieldValues(swModelDoc, "STD_Erstellt_von")
    100. End If
    101. If CreationDate = "" Then
    102. CreationDate = SW_CustomProberty_Functions.GetFieldValues(swModelDoc, "STD_Erstellt_am")
    103. Else
    104. CreationDate = SW_CustomProberty_Functions.GetFieldValues(swModelDoc, "STD_Erstellt_am")
    105. End If
    106. Next
    107. Dim Failure As Boolean = CheckTablesFailure(Model_DS)
    108. SyncLock WorkingTable
    109. CFC_SQL_Functions.AddNewRow(FileName.Name, "DateiPfad", FileName.DirectoryName, ConfigurationsList.Count, ModelCreatedby, CreationDate, True, CheckTablesFailure(Model_DS), False, Model_DS)
    110. End SyncLock
    111. Else
    112. ModelCreatedby = SW_CustomProberty_Functions.GetFieldValues(swModelDoc, "STD_Erstellt_von")
    113. CreationDate = SW_CustomProberty_Functions.GetFieldValues(swModelDoc, "STD_Erstellt_am")
    114. SyncLock WorkingTable
    115. CFC_SQL_Functions.AddNewRow(FileName.Name, "DateiPfad", FileName.DirectoryName, ConfigurationsList.Count, ModelCreatedby, CreationDate, True, False, False, Nothing)
    116. End SyncLock
    117. End If
    118. SW_App_Functions.CloseDoc(swModelDoc)
    119. End If
    120. MainBackWorker.ReportProgress(Percent)
    121. If MainBackWorker.CancellationPending Then
    122. Exit For
    123. End If
    124. If swApp Is Nothing Then
    125. swApp = SWFunc_Main_Instance.swApp
    126. End If
    127. Next
    128. End Sub
    129. Private Sub MainBackWorkerCompletet(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
    130. RaiseEvent WorkDone()
    131. MessageBox.Show("Bauteile Geprüft!")
    132. End Sub
    133. Private Sub MainBackWorkerProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
    134. RaiseEvent ReportProgress(e.ProgressPercentage)
    135. End Sub
    136. Private Sub FeatureCheck(ByVal swModelDoc As sldworks.IModelDoc2, ByVal ConfigTable As DataTable, ByVal ParentName As String)
    137. Dim swFeature As sldworks.Feature = swModelDoc.IFirstFeature
    138. Do While Not swFeature Is Nothing
    139. AddNewRowInConfigTable(ConfigTable, swFeature.GetTypeName2(), swFeature.Name, "Boolean", swFeature.IsSuppressed.ToString, ParentName)
    140. If swModelDoc.GetType = swDocumentTypes_e.swDocPART Then
    141. SubFeatureCheck(swFeature, ConfigTable, swModelDoc, swFeature.Name)
    142. End If
    143. swFeature = swFeature.IGetNextFeature
    144. Loop
    145. End Sub
    146. Private Sub SubFeatureCheck(ByVal swSubFeature As sldworks.IFeature, ByVal ConfigTable As DataTable, ByVal swModelDoc As sldworks.IModelDoc2, ByVal ParentName As String)
    147. Do While Not swSubFeature Is Nothing
    148. AddNewRowInConfigTable(ConfigTable, swSubFeature.GetTypeName2(), swSubFeature.Name, "Boolean", swSubFeature.IsSuppressed.ToString, ParentName)
    149. If swSubFeature.GetTypeName2 = "Sketch" Or swSubFeature.GetTypeName2 = "ProfileFeature" Then CheckallMeasurement(swSubFeature, ConfigTable, swModelDoc, swSubFeature.Name)
    150. swSubFeature = swSubFeature.IGetNextSubFeature
    151. Loop
    152. End Sub
    153. Private Sub CheckallMeasurement(ByVal swSubFeature As sldworks.IFeature, ByVal ConfigTable As DataTable, ByVal swModelDoc As sldworks.IModelDoc2, ByVal ParentName As String)
    154. Dim State As Boolean = swSubFeature.Select2(True, 0)
    155. swModelDoc.EditSketch()
    156. Dim swDispDimension As sldworks.IDisplayDimension = CType(swSubFeature.GetFirstDisplayDimension, sldworks.IDisplayDimension)
    157. Do While Not swDispDimension Is Nothing
    158. Dim swDimension As sldworks.Dimension = swDispDimension.IGetDimension
    159. AddNewRowInConfigTable(ConfigTable, "Dimension", swDispDimension.GetNameForSelection, "Double", swDimension.Value.ToString, ParentName)
    160. swDispDimension = CType(swSubFeature.GetNextDisplayDimension(CType(swDispDimension, Object)), sldworks.IDisplayDimension)
    161. Loop
    162. swModelDoc.InsertSketch2(False)
    163. End Sub
    164. Private Sub AddNewRowInConfigTable(ByVal ConfigTable As DataTable, ByVal TypeName As String, ByVal Name As String, ByVal ValueType As String, ByVal Value As String _
    165. , ByVal ParentName As String)
    166. Dim Newrow As DataRow = ConfigTable.NewRow
    167. Newrow.BeginEdit()
    168. Newrow("Type") = TypeName
    169. Newrow("Name") = Name
    170. Newrow("ValueType") = ValueType
    171. Newrow("Value") = Value
    172. Newrow("Failure") = False
    173. Newrow("Parent") = ParentName
    174. Newrow.EndEdit()
    175. ConfigTable.Rows.Add(Newrow)
    176. End Sub
    177. Private Function CheckTablesFailure(ByVal Model_DS As DataSet) As Boolean
    178. Dim ReturningBoolean As Boolean = False
    179. For Each FirstTable As DataTable In Model_DS.Tables
    180. For Each SecondTable As DataTable In Model_DS.Tables
    181. If FirstTable.TableName <> SecondTable.TableName Then
    182. For Each FirstRow As DataRow In FirstTable.Rows
    183. Dim FoundRow() As DataRow = SecondTable.Select("Name ='" & FirstRow("Name").ToString & "'")
    184. For Each SecondRow As DataRow In FoundRow
    185. If FirstRow("Value").ToString <> SecondRow("Value").ToString Then
    186. FirstRow.BeginEdit()
    187. FirstRow("Failure") = True
    188. FirstRow.EndEdit()
    189. SecondRow.BeginEdit()
    190. SecondRow("Failure") = True
    191. SecondRow.EndEdit()
    192. ReturningBoolean = True
    193. End If
    194. Next
    195. Next
    196. End If
    197. Next
    198. Next
    199. Return ReturningBoolean
    200. End Function
    201. Private Sub UpdateTable_temp() Handles CFC_SQL_Functions.UpdateTable
    202. RaiseEvent UpdateTable()
    203. End Sub
    204. End Class


    und der Code der Page
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Data
    3. Imports System.Windows.Forms
    4. Imports System.Windows.Controls
    5. Imports System.ComponentModel
    6. Imports SWPDM_EnterPrise_Functions_001
    7. Class Admin_Page
    8. Dim WithEvents CFC_Main_Instance_hnd As Main_Instance
    9. Dim FilePath As String = ""
    10. Dim RefreshCounter As Integer = 0
    11. Private SWPDM_MainFunctions As SWPDM_EnterPrise_Functions_001.Main_Instance
    12. Private GOKMF_Main_Instance As New GOK_Main_Functions.Main_Instance
    13. Private GOKMF_MessegaBoxes As New GOK_Main_Functions.GOK_MessegaBoxes(GOKMF_Main_Instance)
    14. Private GOKMF_FileFunctions As New GOK_Main_Functions.GOK_File_functions(GOKMF_Main_Instance)
    15. Private GOKMF_DGV_Functions As New GOK_Main_Functions.GOK_Datagridview_Functions(GOKMF_Main_Instance)
    16. Private SourceView As DataView
    17. 'Private Bindingview As BindingListCollectionView
    18. Dim WithEvents MainBackWorker As New BackgroundWorker With {.WorkerReportsProgress = True, .WorkerSupportsCancellation = True}
    19. Public Sub New(ByVal CFC_Main_Instance As Main_Instance)
    20. InitializeComponent()
    21. CFC_Main_Instance_hnd = CFC_Main_Instance
    22. SourceView = CFC_Main_Instance_hnd.WorkingTable.DefaultView
    23. ''Bindingview = New BindingListCollectionView(SourceView)
    24. End Sub
    25. Private Sub Admin_Page_Loaded(sender As Object, e As EventArgs) Handles Me.Loaded
    26. SourceView = CFC_Main_Instance_hnd.WorkingTable.DefaultView
    27. Me.DGR_001.ItemsSource = SourceView
    28. SWPDM_MainFunctions = New SWPDM_EnterPrise_Functions_001.Main_Instance()
    29. Me.CMB_SourceSelect.Items.Add("DateiPfad")
    30. Me.CMB_FilterSelect.Items.Add("Filter...")
    31. Me.CMB_FilterSelect.Items.Add("SQL Filter Text...")
    32. Me.CMB_FilterSelect.Items.Add("Fehler Anzeigen")
    33. For Each VaultName As String In SWPDM_MainFunctions.VaultList
    34. Me.CMB_SourceSelect.Items.Add(VaultName)
    35. Next
    36. Me.BTN_Assem_Check_Click(Nothing, Nothing)
    37. Me.BTN_Part_Check_Click(Nothing, Nothing)
    38. End Sub
    39. Private Sub Admin_Page_SizeChanged(sender As Object, e As SizeChangedEventArgs) Handles Me.SizeChanged
    40. Me.Border_01.Width = Me.ActualWidth
    41. End Sub
    42. Private Sub BTN_FolderSelecteion_Click(sender As Object, e As RoutedEventArgs) Handles BTN_FolderSelecteion.Click
    43. Dim OpenFileDialog As FolderBrowserDialog = New FolderBrowserDialog
    44. Dim Result As DialogResult = OpenFileDialog.ShowDialog()
    45. If Result = DialogResult.OK Then
    46. If OpenFileDialog.SelectedPath <> "C:\Users\" & CFC_Main_Instance_hnd.UserLoginName & "\Desktop" Then
    47. FilePath = OpenFileDialog.SelectedPath
    48. Me.TXT_Path.Text = FilePath
    49. End If
    50. End If
    51. End Sub
    52. Private Sub CMB_SourceSelect_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles CMB_SourceSelect.SelectionChanged
    53. If CMB_SourceSelect.SelectedIndex = 0 Then
    54. Me.BTN_FolderSelecteion.IsEnabled = True
    55. Me.TXT_Path.IsEnabled = True
    56. Else
    57. Me.BTN_FolderSelecteion.IsEnabled = False
    58. Me.TXT_Path.IsEnabled = False
    59. End If
    60. End Sub
    61. Private Sub BTN_Assem_Check_Click(sender As Object, e As RoutedEventArgs) Handles BTN_Assem_Check.Click
    62. If CFC_Main_Instance_hnd.Assembly_Check = False Then
    63. CFC_Main_Instance_hnd.Assembly_Check = True
    64. Me.BTN_Assem_Check.Background = Brushes.LightGray
    65. Else
    66. CFC_Main_Instance_hnd.Assembly_Check = False
    67. Me.BTN_Assem_Check.Background = Brushes.White
    68. End If
    69. End Sub
    70. Private Sub BTN_Part_Check_Click(sender As Object, e As RoutedEventArgs) Handles BTN_Part_Check.Click
    71. If CFC_Main_Instance_hnd.Part_Check = False Then
    72. CFC_Main_Instance_hnd.Part_Check = True
    73. Me.BTN_Part_Check.Background = Brushes.LightGray
    74. Else
    75. CFC_Main_Instance_hnd.Part_Check = False
    76. Me.BTN_Part_Check.Background = Brushes.White
    77. End If
    78. End Sub
    79. Private Sub BTN_Start_Function_Click(sender As Object, e As RoutedEventArgs) Handles BTN_Start_Function.Click
    80. If Me.CMB_SourceSelect.SelectedIndex = 0 Then
    81. If FilePath <> "" Then
    82. Dim FileExtensionList As New List(Of String) From {"sldprt", "sldasm"}
    83. CFC_Main_Instance_hnd.FileDictionary = GOKMF_FileFunctions.GetFilesInPath(FilePath & "\", FileExtensionList)
    84. Me.PRGBar_001.Maximum = 100
    85. Me.PRGBar_001.Value = 0
    86. Me.BTN_Stop_Function.IsEnabled = True
    87. Me.BTN_Start_Function.IsEnabled = False
    88. CFC_Main_Instance_hnd.StartFolderWork()
    89. Else
    90. GOKMF_MessegaBoxes.NoPath()
    91. End If
    92. Else
    93. End If
    94. End Sub
    95. Private Sub Progressbar(ByVal Counter As Integer) Handles CFC_Main_Instance_hnd.ReportProgress
    96. Dispatcher.BeginInvoke(New MethodInvoker(Sub() Me.PRGBar_001.Value = Counter))
    97. End Sub
    98. Private Sub BTN_Stop_Function_Click(sender As Object, e As RoutedEventArgs) Handles BTN_Stop_Function.Click
    99. CFC_Main_Instance_hnd.CancelBCKWorker()
    100. Me.BTN_Stop_Function.IsEnabled = False
    101. Me.BTN_Start_Function.IsEnabled = True
    102. Me.PRGBar_001.Value = 0
    103. RefreshCounter = 0
    104. End Sub
    105. Private Sub AllPartsChecked() Handles CFC_Main_Instance_hnd.WorkDone
    106. Me.BTN_Stop_Function.IsEnabled = False
    107. Me.BTN_Start_Function.IsEnabled = True
    108. Me.PRGBar_001.Value = 0
    109. RefreshCounter = 0
    110. Changecolor()
    111. End Sub
    112. Private Sub Changecolor()
    113. End Sub
    114. Private Sub RefreshDGR() Handles CFC_Main_Instance_hnd.UpdateTable
    115. Dispatcher.BeginInvoke(New MethodInvoker(Sub() Me.DGR_001.Items.Refresh()))
    116. End Sub
    117. End Class


    Gruß

    Spoiler hinzugefügt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo,

    das Thema hat sich von allein behoben. Nachdem ich eingestellt habe welche Spalten sichtbar sind und welche nicht, war das Problem weg.
    Auslöser des Problems ist mit ziemlicher wahrscheinlichkeit die xml Spalte 'Failure' in der SQL Tabel gewesen.

    Gruß
    Zunächstmal bin ich verwirrt, dass du in einem WPF-Projekt mit einem DatagridView hantierst.
    WPF hat ein anderes GUI-Konzept, und darauf abgestimmte eigene Controls.
    Da passt ein DGV hinein wie ein männlicher Neoceratodus in die Mädchen-Toilette.

    Ansonsten funktioniert es nicht, datengebundene Datenklassen im Nebenthread zu befüllen.
    Weil via Databinding wird auf GUI-Elemente zugegriffen, und das stellt einen unzulässigen threadübergreifenden Vorgang dar.
    Normalerweise werden unzulässige threadübergreifende Vorgänge mit einer Fehlermeldung quittiert, aber bei Databinding versagt dieser Sicherheitsmechanismus.
    Deine erste Fehlermeldung ist also vor diesem Hintergrund korrekt, verständlich, sinnvoll - dass sich das Problem in Luft aufgelöst hat ist so schön wie besorgniserregend.

    Also nicht wundern, wenn das iwann wiederkommt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades

    Das mit DGV ist eine Fehler meiner seit's, bin noch mit den Form's elementen geistig verbunden. Ich meine natürlich ein DataGrid.
    Also würdest du mir empfehlen die kpl. Page im Nebenthread laufen zu lassen bzw. die Datatable im 'ReportsProgress' zu befüllen(letzteres sicherlich besser), verstehe ich dich da richtig?
    Alle GUI muss immer im GUI-Thread (alias Main-Thread) - auch in WPF.
    WPF macht viel Hype, dass alles mögliche jetzt asynchron möglich sei. Vielleicht sogar auch eine gebundene DataTable befüllen.
    Ich glaub aber nicht.
    Also wenn nicht, musst du Daten asynchron holen, und synchron eintragen.
    Ich mache neuerdings gute Erfahrungen mit dem DataTable.Merge-Feature.
    Demnach könnte man die Daten asynchron in eine TempTable laden, und synchron dann einmergen in die ZielTabelle.
    Das ist sogar schneller als die Tabelle löschen und neu aufbauen.
    Allerdings muss man vorm Mergen aus der ZielTabelle diejenigen Rows removen (nicht deleten!), die in der TempTable fehlen. (Mit Linq geht das recht flott)
    @ErfinderDesRades

    So ich kann nun deine Aussage bestätigen.


    WPF macht viel Hype, dass alles mögliche jetzt asynchron möglich sei. Vielleicht sogar auch eine gebundene DataTable befüllen.Ich glaub aber nicht.


    Das funktioniert nicht!!! Nachdem ich die Datarow im ReportProgress verschoben habe. Läuft es einwandfrei, trotz eingeschalteter XML Spalte.

    Gruß

    GOKTerek schrieb:

    Nachdem ich die Datarow im ReportProgress verschoben habe. Läuft es einwandfrei, trotz eingeschalteter XML Spalte.
    Dir muss klar sein, dass damit u.U. die Befüllung wieder im Gui-Thread stattfindet , und der BGW tatsächlich eigentlich garnichts mehr macht.
    Das ist glaub nicht ganz das, wie Nebenläufigkeit eigentlich gedacht ist.

    Oder sind bei dir nun noch weitere zeitraubende Tätigkeiten im NebenThread verblieben?

    Ich stelle mir vor, dass nun deinem BGW aufwändig aus dem Gui eine DataTable übergeben wird, nur um diese Zeile für Zeile wieder ans Gui zurückzudelegieren.
    Da wird dann viel Performance verbrannt für sehr wenig Ergebnis (ja, die Progressbar wackelt, aber ohne PB wärs womöglich doppelt so schnell erledigt)

    Ansonsten ist der BGW sowieso Müll aus dem vorletzten Jahrzehnt - Nebenläufigkeit geht mit Async viel besser.
    Also der BGW macht noch die Hauptarbeit, das ablegen in die SQL-Datenbank ist nur aus Dokumentarischen zwecken.
    Den BGW habe ich auch nur eingesetzt, damit mir die Page nicht einfriert(kenne ich noch aus Forms).

    Der BGW wird in der nächsten Version abgesetzt. Ich muss mich aber auch erstmal mit WPF auseinandersetzen.
    Da ist soviel gleich aber auch unterschiedlich :rolleyes: :D .