السلام عليكم
حياكم الله
معروف أنك لو حاولت أن تكتب thread تحاول الوصول إلى threadأخرى سوف يتم إلقاء خطأ الCrossThread
و سوف تضطر إلى إستخدام CheckForIllegalCrossThreadCalls
و لكن هناك طريقة أخرى تمكنك من جعل الأمر أفضل
راقب الكود التالى
أنا أستخدم كود خاص بى أعطيه إسم الدالة(method) و فقط
Mlabs.Threading.invoker.ThreadWorker(this.FillLstBox);
و هو ينادى على هذا الكود
public static void ThreadWorker(Method paramLess)
{
ThreadStart threadDelegate = new ThreadStart(paramLess);
Thread startWork = new Thread(threadDelegate);
startWork.Start();
}أنا معرف Delegate قبل هذه الدالة
public delegate void Method();
و هذه هى دالة الFillLstBox
private void FillLstBox()
{
DataTable existingAnnounTable;
using (SqlCommunicationCenter addNewAnnoun = new SqlCommunicationCenter(Properties.Resources.HRDBconnectionstring))
{
existingAnnounTable = addNewAnnoun.GetRecords("SELECT annID,annTitle+' رقم : '+annCode AS AnnName FROM annoucements ORDER BY AnnName");
}
this.Invoke(new FillInMethod(FIllIn), existingAnnounTable);
}
private void FIllIn(DataTable tb)
{
this.lstBoxPresentAnnoun.DataSource = tb;
this.lstBoxPresentAnnoun.DisplayMember = "AnnName";
this.lstBoxPresentAnnoun.ValueMember = "annID";
}لو لاحظتم أننى وضعت دالتين
الأولى والتى ينادى عليها ال invoker.ThreadWorker
و الثانية و التى تسمى FIllIN أقوم بمناداتها من الFillLstBox
حيث أنكم لو لاحظتم أن هذه الدالة تستخدم أحد الMembers الخاصة بالthread الMain و التى هى الlsbBox
هنا أستخدم
this.Invoke(new FillInMethod(FIllIn), existingAnnounTable);
حتى أقنع الكود أن التدخل تم من خلال نفس الthread الأصلية و ليس الأخرى الفرعية
فهل هذا هو الأسلوب الصحيح المفروض أتبعه لكى أكتب كود أمن و أضمن عدم حدوث تداخل بين الthreads الحالية ؟؟
أم أننى لو إستخدمت ال
Checkforillegalcrossthreadcalls
لن يحدث شئ و أريح رأسى من هذا الأمر !!!!!