PDA

View Full Version : سوال: اررور خسته کننده Thread Was Being aborted !!!!



djhooman
پنج شنبه 09 مرداد 1393, 03:02 صبح
سلام دوستای گلم ....

خیلی دنبال این موضوع و حل اررور گشتم اما پیدا نشد راه حلش و هنوز ایراد تو برنامم هستش ...

من برای لود اطلاعاتم توی قسمت نمایش کارتابل از Stored Procedure استفاده میکنم و مشکلی ندارم .
توی هر رکوردمم 2 تا چک باکس دارم که سرپرست باید حالا یا تایید یا عدم تایید کنه با توجه به سیستم کاری که داره ...
بعدش باید دکمه ثبت تغییرات رو بزنه ...
موقع زدن دکمه ثبت تغییرات گاهاً ( نه همیشه و متناوب ) این اررور زیر میاد ...
معمولا توی دستگاه هایی با کانفیگ سخت افزاری قوی ، کمتر این اررور و میده و توی دستگاه با رم 512 مگابایت یهو کل صفحه و کنترل های نرم افزار به شکل ضربدر http://barnamenevis.org/image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAdCAIAAAD HFAKuAAAA4klEQVRoge3VUQ7CIBBFUfa/WneAHxpTO2AoIDOXvht TJp2Osdoygpe8h5AjSZCfCLEVyJMSSf6ESH NBFeRVXdXV1vD H4U9Wn8dXNIeyY7LZN38y/CGv3uRvqgrdeR1i7806oLn8onoTFB4FQgwwciLD2aPcdBRzmNN jxU/mKOF//ZXsMC2aDEdpmLZoCZsMT2lowuGC2DQltoF/FjjYkbAHbSRRPOMUDjQojXLZrEOqJ8PHd wrHcePsMc4kdrCcc84vMm/CsGsqFmTa34QKlwjxiRCfCPGJEJ8I8YkQ3xMSy7fvZEfBVwAAA ABJRU5ErkJggg== میشه و کاربر مجبور به راه اندازی مجدد نرم افزار میشه ...
چطور این مشکل ( ضربدر شدن کنترل هام ) و از همه مهمتر اررور Thread Was Being aborted رو حل کنم ؟؟؟
باز هم میگم همیشه این اتفاق نمی افته ... یبار ممکنه توی 2 بار ثبت تغییرات زدن پشت هم بیفته ، سری بعدی ممکنه 10 بار هم ثبت تغییرات زده یشه اتفاقی نیوفته و عادی باشه !!!

121760

تکه کد مربوط به دکمه ثبت تغییرات :



Private Sub ConfirmToSV()

CheckForIllegalCrossThreadCalls = False
Dim cPro As New clsProgress()
cPro.startProgress()
ButtonX3.Enabled = False
Try
Dim SQLCnn As New SqlConnection(cnnString)
SQLCnn.Open()
For Each dgRow As Telerik.WinControls.UI.GridViewRowInfo In RadGridView1.SelectedRows
Dim DigitalId As String = dgRow.Cells(3).Value.ToString()
Dim AdminConfirm As Boolean = Convert.ToBoolean(dgRow.Cells(12).Value)
Dim ShowInSV As Boolean = Convert.ToBoolean(dgRow.Cells(13).Value)

Dim strQuery As String = "update [Order] set MonthSV = '" & MonthSV.Text & "',TaeidModir = '" & AdminConfirm.ToString & "' , ShowInSV = '" & ShowInSV.ToString & "' where DigitalID = " & DigitalId & ""
Dim cmdSelect As New SqlCommand(strQuery, SQLCnn)
cmdSelect.ExecuteNonQuery()
Next
SQLCnn.Close()
cPro.stopProgress()
MessageBox.Show("تغییرات ثبت گردید", "ثبت", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
ButtonX3.Enabled = True
ClearMemory()

End Sub
Private Sub ButtonX2_Click(sender As Object, e As EventArgs) Handles ButtonX2.Click
Try
Dim th1 As New Threading.Thread(AddressOf ConfirmToSV)
th1.Start()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

djhooman
جمعه 10 مرداد 1393, 21:12 عصر
40 تا مشاهده و بی جواب ؟؟؟

کسی واقعا به این مشکل بر نخورده ؟؟؟

lastmory
شنبه 11 مرداد 1393, 09:47 صبح
منم این خطا رو داشتم
توی بعضی از سیستمها میداد
نتونستم حلش کنم و به طور کلی برداشتمش
Thread رو :(

djhooman
شنبه 11 مرداد 1393, 20:53 عصر
من فکر میکنم نه من ، نه کس دیگه اولین نفری نیستیم ک به این مشکل برخوردیم !!!
پس باید راه حلی داشته باشه
از اساتید فنی و با تجربه کسی نمیدونه ؟؟؟

djhooman
شنبه 11 مرداد 1393, 20:59 عصر
ترد که برداشته بشه برنامه هنگ میکنه و ...

djhooman
چهارشنبه 15 مرداد 1393, 18:27 عصر
کسی نظر یا راه حلی نداره ؟؟؟
بخدا خیلی گشتم راجع بهش اما جوابی نگرفتم ...

systam
چهارشنبه 15 مرداد 1393, 19:05 عصر
کسی نظر یا راه حلی نداره ؟؟؟
بخدا خیلی گشتم راجع بهش اما جوابی نگرفتم ...
سلام
سوالت رو در بخش C# مطرح کن
دوستان اونجا بیشتر فعالند

محمد آشتیانی
چهارشنبه 15 مرداد 1393, 19:32 عصر
سلام دوست عزیز
نوشتن CheckForIllegalCrossThreadCalls = False در واقع یه جورایی پاک کردن صورت مسئله هست و اینکه کدت رو ناامن میکنه و همینطور که خودت گفتی گاهی کار میکنه و گاهی خیر
یعنی بستگی به شرایط اجرای برنامت داره اینکه خطا رو ببینی یا خیر
بجای این عبارت باید از Delegate استفاده کنی ، بنابر این کدت به صورت زیر تغییر میکنه (البته من ندید نوشتم ممکنه ویرایش بخواد و شایدم نه)


Private Delegate Sub ConfirmToSVDelegate()
Private Sub ConfirmToSV()
If InvokeRequired Then
Invoke(new ConfirmToSVDelegate(AddressOf ConfirmToSV))
Exit Sub
End If
Dim cPro As New clsProgress()
cPro.startProgress()
ButtonX3.Enabled = False
Try
Dim SQLCnn As New SqlConnection(cnnString)
SQLCnn.Open()
For Each dgRow As Telerik.WinControls.UI.GridViewRowInfo In RadGridView1.SelectedRows
Dim DigitalId As String = dgRow.Cells(3).Value.ToString()
Dim AdminConfirm As Boolean = Convert.ToBoolean(dgRow.Cells(12).Value)
Dim ShowInSV As Boolean = Convert.ToBoolean(dgRow.Cells(13).Value)
Dim strQuery As String = "update [Order] set MonthSV = '" & MonthSV.Text & "',TaeidModir = '" & AdminConfirm.ToString & "' , ShowInSV = '" & ShowInSV.ToString & "' where DigitalID = " & DigitalId & ""
Dim cmdSelect As New SqlCommand(strQuery, SQLCnn)
cmdSelect.ExecuteNonQuery()
Next
SQLCnn.Close()
cPro.stopProgress()
MessageBox.Show("تغییرات ثبت گردید", "ثبت", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
ButtonX3.Enabled = True
ClearMemory()
End Sub
Private Sub ButtonX2_Click(sender As Object, e As EventArgs) Handles ButtonX2.Click
Try
Dim th1 As New Threading.Thread(AddressOf ConfirmToSV)
th1.Start()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub




موفق باشید.

djhooman
چهارشنبه 15 مرداد 1393, 20:07 عصر
اقای اشتیانی عزیز ممنونم بابت راهنمایی ات
اما میشه یه توضیح کوچیک بدید delegate چیه و چیکار میکنه ؟

محمد آشتیانی
چهارشنبه 15 مرداد 1393, 20:31 عصر
سلام مجدد
Delegate میشه گفت یه اشاره گر هست به متد
ببین تو برنامه هایی که Multi-thread هستن ، مشکلی که به وجود میاد اینه که مثلا UI برنامه توسط Thread اصلی کنترل میشه ، حالا وقتی شما از توی یه Thread دیگه به یکی از کنترل های UI میخوای دسترسی پیدا کنی ، باعث ایجاد تداخل میشه ، یعنی 2 تا ترد با هم رقابت میکنن برای دسترسی به اون آبجکت
حالا کاری که اینجا انجام میشه اینه که Invoke بررسی میکنه که آیا کد شما تو ترد درست داره اجرا میشه یا خیر ، اگه جواب خیر باشه به وسیله اون Delegate که عرض شد متد شما داخل ترد درست اجرا میشه.
البته میدونم توضیحاتم شاید نامفهوم باشه ، بنابراین عذر خواهی میکنم.


موفق باشید.

djhooman
جمعه 17 مرداد 1393, 02:35 صبح
دوست عزیز ،
ممنون بابت پاسخت ات

اما مشکل کماکان پابرجاست !!!!!!!
یعنی بطوریکه تعداد دفعاتی که دکمه ثبت تغییرات زده میشه زمان نمایش اررور بیشتر شده ( قبلا اگر 5-6 تا درمیان این ارور و میداد الان حدود 20-30 تا درمیان اررور و میده و ناگهان برنامه بصورت کامل بسته میشه و پیام Crash شدن و End Now رو میده ) !!!!!!!!!!!!!! :متعجب::متعجب::متعجب::متعجب:: تعجب::متعجب::متعجب:

محمد آشتیانی
جمعه 17 مرداد 1393, 02:48 صبح
سلام
شما کد های cPro.startProgres و cPro.stopProgress رو کامنت کن و ببین باز خطا اتفاق میفته یا خیر
ضمنا کدی که بالاتر عرض کردم روش اصولی برای جلوگیری از تداخل ترد هاست و ربطی به تعداد دفعات وقوع خطا نداره

hrj1981
شنبه 25 اردیبهشت 1395, 22:19 عصر
با سلام
اگر در حالت فوق sub ما دارای پارامتر بود باید چکار کنیم ؟

hA.d1983
یک شنبه 26 اردیبهشت 1395, 18:09 عصر
منم تو یه پروژه این مشکل رو داشتم
مجبور شدم کلا برش دارم
هنگ کردن های طولانی رو به متوقف شدن گاه و بی گاه برنامه م ترجیح دادم
آخرشم متوجه نشدیم بابت چی بود