الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل إستخدام Checkforillegalcrossthreadcalls صواب أم أنه خطأ

بدأه _- محمد نور -_ في 22 نوفمبر 2008 · 5 رد · 634 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

حياكم الله

معروف أنك لو حاولت أن تكتب 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

لن يحدث شئ و أريح رأسى من هذا الأمر !!!!!

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#2

أحب أن أزيد على حضرتك شيئ

هناك خاصية اسمها

Control.InvokeRequired

يعني إنك المفروض قبل ما تعمل

Control.Invoke

اتأكد من إن الخاصية دي بترجع true

يعني الكود الأفضل يكون كالتالي

if (this.InvokeRequired)
this.Invoke(new FillInMethod(FIllIn), existingAnnounTable);
else
FIllIn(existingAnnounTable);

وده حتى يكون أفضل في حالة إنك قررت تسيب الـ Threading بالنسبة للكود

الحاجة التانية:

الكود كده كويس جدا وده هو الأفضل وفعلا هو وجع دماغ الحوار ده كله بس عامة هو أفضل من Checkforillegalcrossthreadcalls لإن في الغالب النتايج ما بتكونش كويس وبتظهر رسائل أخطاء غريبة وبيبقى صعب التعامل معاها.

إضافة:

مكتوب في MSDN عن هذه الخاصية (لاحظ المكتوب):

When a thread other than the creating thread of a control tries to access one of that control's methods or properties, it often leads to unpredictable results. A common invalid thread activity is a call on the wrong thread that accesses the control's Handle property. Set CheckForIllegalCrossThreadCalls to true to find and diagnose this thread activity more easily.
#3

الصراحة أنا كتبت أكواد على الأقل 10 أضعاف الكمية بسبب الcrossThread هذا

و أصبت باليأس من كثرة الكتابة

ألا يوجد طريقة أستطيع أن أستخدمها تخلصنى من وجع الرأس هذا من دون أن أغلق خاصية ال Checkforillegalcrossthreadcalls

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#4

عندي فكرة جبارة

ما تستخدمش Threading

:lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

#5
OOP Emperor كتب:
عندي فكرة جبارة

ما تستخدمش Threading

:lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

يريييييييييييييييييييييييت

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#6

بســم الله الـرحمــن الرحيم

أخي الكريم .. حسب تجربتي المتواضعة : خاصية ال Checkforillegalcrossthreadcalls نستخدمها عندما يكون ال crossThread غير

مهم ولا يؤدي إلى أخطاء بالنتائج مثل إستخدام ال Controls في ال Thread وإعطائها قيمة معينة كل فترة معينة ....

أما في الحالات التي تحتاج إلى عزل و حماية و ترتيب لمجموعة Threads عمليات متلاحقة دون تداخل ولأن ال crossThread يؤدي إلى أخطاء في النتائج بعد التحليل المنطقي فعليك عدم إستخدام خاصية ال Checkforillegalcrossthreadcalls وعليك كتابة كود أكثر للتأكد من سير ال

Threads وعملياتها بشكل صحيح والتأكد من عدم حصول crossThread ...

في هذه الحالة أعتقد أنك بحاجة فقط لتحديث بيانات فبإمكانك إستخدام Checkforillegalcrossthreadcalls والتجربة خير دليل ..

بالتوفيق ...

سبحان الله وبحمده سبحان الله العظيم

لا تنسونا من صالح دعائكم ...

وفقكم الله وسدد خطاكم ...

مواضيع مشابهة