-
threads !!!!?????
سلام رفقا
كسي ميدونه اگه يه روزگاري يكي خواست داخل يه thread يه اكسپشن raise يا به عبارت بهتر throw كنه كجا ميتونه handle exception كنه؟ يعني مني كه يه ترد جداگانه run كردم هيچ جاي برنامم نميتونم اكسپشن احتمالي رو cach كنم مگر تو خود thread ؟؟؟؟؟ اگه اينجوري باشه (كه اميدوارم نباشه) خيلي ضايعه هااااااااا فكر كنننننننننننن !!!
-
سلام
به نظر میرسه هنوز میتوان به مطرح شدن سوالات جالب در تالار امیدوار بود.!
==============
اولاً تاکید میکنم که هر خطایی باید از قبل پیش بینی شده باشد و در محلش که احتمال خطا وجود داشته، فکری شده باشد و دستور Try مناسب نوشته شده باشد.
ولی بعد از انجام بند فوق انجام این کار هم برای محکم کاری خوب است.
برای اطمینان و اینکه حداقل Exception هایی که از دستمام در رفته را جایی ذخیره کنیم تا بعداً برنامه نویس سر فرصت آن ایراد را رفع کنیم، و نیز پیغام مناسب به کاربر نشان داده شود.
راه حل هم ساده است. شما میتوان در اولین متد راه اندازی شده توسط ریسمان یک Try قرار دهید.
کد:
کد قدیم
Dim thread As New System.Threading.Thread(AddressOf Me.Start)
thread.Start(Nothing)
'...
Private Sub Start(ByVal parameter As Object)
'...
'codes..
'...
End Sub
کد جدید
Dim thread As New System.Threading.Thread(AddressOf Me._Start)
thread.Start(Nothing)
'...
Private Sub _Start(ByVal parameter As Object)
Try
Me.Start(parameter)
Catch ex As Exception
'...
'code for exception.
'...
End Try
End Sub
Private Sub Start(ByVal parameter As Object)
'...
'codes..
'...
End Sub
این روش در همه جا قابل استفاده است ولی اگر تعداد ریسمان ها زیاد باشد شاید نوعی تکرار و copy و paste را منجر شود، که در برنامه نویسی جالب نیست.
==============
در نتیجه در مرحله دوم پیشنهاد ساخت یک کلاسس مخصوص این کار را میدهم، مثلاً این کد
کد:
Public NotInheritable Class ThreadManager
Private m_Delegate As System.Threading.ParameterizedThreadStart
Private Sub New()
'No Code.
End Sub
Public Shared Function CreateNewThreadInstance(ByVal start As System.Threading.ParameterizedThreadStart) As System.Threading.Thread
Dim wrapper As New ThreadManager
wrapper.m_Delegate = start
Return New System.Threading.Thread(AddressOf wrapper.Start)
End Function
Private Sub Start(ByVal parameter As Object)
Try
Me.m_Delegate(parameter)
Catch ex As Exception
Me.ThreadException(ex)
End Try
End Sub
Public Sub ThreadException(ByVal ex As System.Exception)
'Dim currentthread As System.Threading.Thread = System.Threading.Thread.CurrentThread
'...
'Exception register...
'...
End Sub
End Class
حالا تنها کاری که باید انجام دهید، آن است که به جای New ساختن یک ریسمان متد جدید CreateNewThreadInstance را استفاده کنید، دیگر از copy و paste هم خبری نیست !
کد:
کد قدیم
Dim thread As New System.Threading.Thread(AddressOf Me.Start)
thread.Start(Nothing)
کد جدید
Dim thread As System.Threading.Thread = ThreadManager.CreateNewThreadInstance(AddressOf Me.Start)
thread.Start(Nothing)
میبینید که فقط خط اول و نحوه وهله سازی تغییر کرد و دیگر هیچ تغییری در کدها لازم نیست و کلیه خطاهای ریسمانهایی که به این نحو ساخته شوند برای مدیریت به متد ThreadException خواهد رسید.
البته میتوانید overload های دیگری برای CreateNewThreadInstance بسازید تا همه انواع New سازی ذاتی Thread را شبیه سازی کند.
-
سلام
میبخشید پا برهنه می یام وسط ولی این threads چی هست (منضور همون بحث چند نخی در سیستم عامله)؟
-
سلام
ریسمان یا به قول شما نخ یا یک فرآیند پردازش موازی و... که ویندوز از ان پشتیبانی میکند و ما در دات نت استفاده میکنیم.
توضیح بیشتر نمیدهم چون گمان میکنم میدانید چه میگویم و متوجه شدید منظور چیست.