منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : مشكلة break state
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الكود التالي استخدمه لعمل تحديث لكامل قاعدة البيانات والتي تتضمن 3000 سجل

كود :
'  تصفير الاسعار والكميات
   Public Sub Reset()
       For i As Integer = 0 To DGridItems.Rows.Count - 1
           Dim dt As New DataTable
           Dim Adapter As New SqlDataAdapter
           dt.Clear()
           Adapter = New SqlDataAdapter("select * from Items where ItemID = " & DGridItems(0, i).Value & "", sqlcon)
           Adapter.Fill(dt) '  
           Dim c As Boolean
           c = DGridItems.Rows(i).Cells(8).Value
           If c = True Then
               If dt.Rows.Count > 0 Then
                   dt.Rows(0).Item("ItemLargePrice") = 0
                   dt.Rows(0).Item("ItemLargeBuyPrice") = 0
                   dt.Rows(0).Item("ItemQtyLarge") = 0
                   dt.Rows(0).Item("ItemQtyMeduim") = 0
                   dt.Rows(0).Item("ItemMeduimPrice") = 0
                   dt.Rows(0).Item("ItemMeduimBuyPrice") = 0
                   Dim save As New SqlCommandBuilder(Adapter)
                   Adapter.Update(dt)
                   dt.AcceptChanges()
               End If

           End If
       Next

   End Sub


لكن المشكلة لا يتم التنفيذ وتظهر المشكلة التي في الصورة ادناه
قم بإجراء العملية في Thread مختلف عن الـ Thread الخاص بواجهة البرنامج :
بما أنك في هذا الإجراء لا تتعامل مع أي كنترول في واجهة البرنامج, من الآمن عمل هذا الإحراء في Thread مختلف.
في أثناء عمل الإجراء لن تتجمد واجهة البرنامج ويمكنك عمل أي شيء في البرنامج بينما الـ Thread يقوم بالعمل في الخلفية.

إذا كنت تستخدم 4.0 NET Framework.  وأعلى أنصحك بإستخدام Task بدلاً من الـ Thread 
[attachment=28269]

بإستخدام الـ Thread 
كود :
Public Sub Reset()
   Dim ResetThread As New Threading.Thread(Sub()
                                               For i As Integer = 0 To DGridItems.Rows.Count - 1
                                                   Dim dt As New DataTable
                                                   Dim Adapter As New SqlDataAdapter
                                                   dt.Clear()
                                                   Adapter = New SqlDataAdapter("select * from Items where ItemID = " & DGridItems(0, i).Value & "", sqlcon)
                                                   Adapter.Fill(dt) '  
                                                   Dim c As Boolean
                                                   c = DGridItems.Rows(i).Cells(8).Value
                                                   If c = True Then
                                                       If dt.Rows.Count > 0 Then
                                                           dt.Rows(0).Item("ItemLargePrice") = 0
                                                           dt.Rows(0).Item("ItemLargeBuyPrice") = 0
                                                           dt.Rows(0).Item("ItemQtyLarge") = 0
                                                           dt.Rows(0).Item("ItemQtyMeduim") = 0
                                                           dt.Rows(0).Item("ItemMeduimPrice") = 0
                                                           dt.Rows(0).Item("ItemMeduimBuyPrice") = 0
                                                           Dim save As New SqlCommandBuilder(Adapter)
                                                           Adapter.Update(dt)
                                                           dt.AcceptChanges()
                                                       End If

                                                   End If
                                               Next
                                           End Sub)

   ResetThread.Start()
End Sub
بإستخدام الـ Task
كود :
   Public Sub Reset()
       Dim ResetTask As New System.Threading.Tasks.Task(Sub()
                                                            For i As Integer = 0 To DGridItems.Rows.Count - 1
                                                                Dim dt As New DataTable
                                                                Dim Adapter As New SqlDataAdapter
                                                                dt.Clear()
                                                                Adapter = New SqlDataAdapter("select * from Items where ItemID = " & DGridItems(0, i).Value & "", sqlcon)
                                                                Adapter.Fill(dt) '  
                                                                Dim c As Boolean
                                                                c = DGridItems.Rows(i).Cells(8).Value
                                                                If c = True Then
                                                                    If dt.Rows.Count > 0 Then
                                                                        dt.Rows(0).Item("ItemLargePrice") = 0
                                                                        dt.Rows(0).Item("ItemLargeBuyPrice") = 0
                                                                        dt.Rows(0).Item("ItemQtyLarge") = 0
                                                                        dt.Rows(0).Item("ItemQtyMeduim") = 0
                                                                        dt.Rows(0).Item("ItemMeduimPrice") = 0
                                                                        dt.Rows(0).Item("ItemMeduimBuyPrice") = 0
                                                                        Dim save As New SqlCommandBuilder(Adapter)
                                                                        Adapter.Update(dt)
                                                                        dt.AcceptChanges()
                                                                    End If

                                                                End If
                                                            Next
                                                            MsgBox("تم الإنتهاء من العمل")
                                                        End Sub)

       ResetTask.Start()
   End Sub