مشكلة break state - mohamedassim - 02-10-22
الكود التالي استخدمه لعمل تحديث لكامل قاعدة البيانات والتي تتضمن 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
لكن المشكلة لا يتم التنفيذ وتظهر المشكلة التي في الصورة ادناه
RE: مشكلة break state - عبدالله الدوسري - 03-10-22
قم بإجراء العملية في 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
|