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

مشكلة في استخدام الثريد في سي شارب

بدأه abulwleed في 7 أغسطس 2010 · 8 رد · 928 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اخواني الأعضاء واجهت مشكلة أثناء برمجة برنامج لي و طرحتها في العديد من المنتديات الأجنبية لكن لم يستطع أحد اجابتي إما لأنه لا يوجد من يتقن هذا المجال أو لأن السؤال ناقص و هذا ما لا اتوقعه

المهم أنا سأضع رابط الموضوع الذي كتبته و يا ريت أحد يكون ذو خبرة في السي شارب يجاوبني و يكتب الرد هنا

الرابط:

http://www.c-sharpcorner.com/Forums/UploadFile/91943/Default.aspx

و شكرا للتعاون اخواني

#2

أولاً أعد كتابة سؤالك هنا (بالعربية ) بعدها نبدأ النقاش :wink: ..

#4

عندي الميثود التالية :

int count = 0;
Mutex mx = new Mutex();
private void ckeckproxyvalidation(string url)
{

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Timeout = 10000;
try
{
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
string tv = res.ResponseUri.ToString();
if(tv.Contains(url) && IsSiteNameExist(url))
{
//mx.WaitOne();
count++;
//mx.ReleaseMutex();
}
}
catch
{
//mx.WaitOne();
count = count - 1 + 1;
//mx.ReleaseMutex();
}
finally
{
MessageBox.Show(count.ToString());
}
}

أحتاج الى استدعائها حوالي 500 مرة في نفس الوقت لأني أحتاج الى النتائج كلها للقيام بوظيفة البرنامج

فإذا لم استخدم الثريد ستكون فعالية البرنامج صفر لأن المستخدم سيضطر للنتظار فترة طويلة جدا

بغض النظر عن الميثود IsSiteNameExist(url) ماذا يكون عملها لكنها سترجع ترو أو فولس

و اطلاق الثريد كتبته بطرقتي التي لا اعلم ان كانت صحيحة أم خاطئة:

foreach (string es in sitefortest/*bellow array*/)
{
new Thread((ThreadStart)delegate { ckeckproxyvalidation(es); }).Start();
//ckeckproxyvalidation(es);
}

و طبعا sitefortest هي مصفوفة نصية كالتالي:

string[] sitefortest =
{
"http://www.megaupload.com",
"http://www.google.com",
"http://www.hotmail.com",
"http://www.yahoo.com",
"http://www.bing.com",
"http://www.youtube.com",
"http://www.facebook.com",
"http://www.islamway.com",
"http://www.mediafire.com",
"http://www.videoproxy.tv",
};

إن المتغير كاون count ستكون نتيجته صحيحة إذا نفذت الميثود checkproxyvalidation عدة مرات متتالية

لكن عندما تنفذ باستخدام الثريد سيحمل المتغير نتيجة مغايرة للصفر لكن غير صحيحة

إذا لم يكن السؤال واضح ارجو الاستفسار عن نقاط الغموض

وفقنا الله لما فيه الخير

تم تعديل هذه المشاركة بواسطة abulwleed في 8 أغسطس 2010 في 09:31

#5

قم بإزالة try .. catch ، حتى تضع يدك على المشكلة ..

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

#6

الهدف من المتغير count هو معرفة عدد المرات التي تم التنفيذ فيها بشكل صحيح ، أليس كذلك ؟

كنظرة أولى

مشكلتلك هي مشكلة synchronization بين Threads حيث تستخدم متحول مشترك ... إستخدامك للmutex صحيح ولكن لماذا قمت بتعليقه ؟

ثانياً :

لم أفهم ماهي الغاية من التعليمة :

count = count - 1 + 1;

النتيجة واحدة (عدم تغيير count ) ...

ثالثاً :

كما فهمت من كلامك أنك تعتبر النتيجة صحيحة إذا كان قيمة المتغير count مثلاُ 10 (عدد المواقع الموضوعة في المصفوفة ) أليس كذلك ؟

هذا يحدث عند حصول Exception بسبب Operation Timeout مثلاً و عندها متحول count لن يتم زيادته و سيتم عرض القيمة الحالة له .....

بالتوفيق

1
#7

شكرا أخي أحمد على المرور لكن البرنامج لا يحمل أي استثناء و هو غير قابل للستثناءات لأن البرنامج مفحوص test على نظام ال white box يعني كل كتلة برمجية على حدا فهي محصورة فقط في ال Operation Timeout كما قال الأخ حسام

و أكرر شكرك على المرور

سيد حسام الفكرة من البرنامج هو فحص البروكسي إذا كان صالح أم لا بالنسبة للمزود.

فسيقوم البرنامج بفحص شيئين ليتأكد من أن البروكسي صالح ألا و هما:

طلب الصفحة ثم النظر في السورس كود ليرى إذا ما كن اسم الموقع موجود في السورس كود أم لا

الأمر الآخر و هو النظر الى response.ResponseUri فإذا كان يحتوي على اسم الموقع نقوم بعمل آند بين الشرطين فإذا كان ترو يكون محقق و بالتالي يضيف واحد لل count و إلا تايم آوت يعني يدخل بالكاتش فيضيف واحد و يطرح واحد

طبعا العملية ليس لها معنى لكني لم أعلم ماذا أضع بالكاتش

و قمت بتعليق الموتيكس لأني أول مرة أستخدمه ولا أعرف كيفيه استخدامه و كانت تجربة مني لم الحظ فرق بين استخدامه و عدم استخدامة بالنسبة للمتغير count فهل استخدام الموتكس بهذا الشكل صحيح أم خاطئ؟

و هل طريقة اطلاق الثريدس صحيحة في كودي؟؟

اقتباس
كما فهمت من كلامك أنك تعتبر النتيجة صحيحة إذا كان قيمة المتغير count مثلاُ 10 (عدد المواقع الموضوعة في المصفوفة ) أليس كذلك ؟

كما قلت باكود السابق نتيجة عمل آند للشرطين إذا كانت ترو يضيف واحد و بالتالي يكفيني عند انتهاء تنفيذ الفنكشن على كل المواقع المذكور

بالكود التالي مع تعليق أحد السطرين داخل حلقة الفور:

foreach (string es in sitefortest/*bellow array*/)
{
new Thread((ThreadStart)delegate { ckeckproxyvalidation(es); }).Start();
//ckeckproxyvalidation(es);
}

أن يكون الكاونت قيمته واحد فقط بالتالي يكون محقق لموقع واحد بالتالي يكون البروكسي صالح.

لذلك أرجو منك أخي حسام أو أعد الأعضاء الآخرين الخبراء في هذا المجال توضيح عم الثريد هل كما فعلت هو الصحيح أم يوجد خصائص أخرى للثريدس يفضل استخدامها أو يكون استخدامها أصح

و بالنسبة لموضوع البروكسي هل ما فعلته كافي ليكشف مدى صحته هل هو فعال أم لا؟؟؟؟؟؟

أم هناك اقتراحات من الاخوة الأعضاء

و شكرا للتفاعل

#8

الآن فهمت القصد من برنامجك :) ...

- إستخدامك للـ ThreadStart صحيح (كطريقة ) و لا أرى فيه مشكلة .. القضية هنا إذا رغبت بتحسن برنامجك : هلى يجب طلب جميع المواقع والتأكد بعدها أن العملية نجحت لواحد على الأقل ؟ ام أن الأفضل هي نجاح أول Thread وبالتالي عدم الحاجة لإكمال البقية ؟

- إستخدامك للـMutex ضروري فقط للتأكد من القيمة count لتعلم عدد مرات نجاح إستدعاء المواقع . ...

- بالنسبة لسطر count = count +1-1 فليس له أي فائدة تذكر فالأفضل إزالته ، يمكنك تسجيل site الذي حدثت له عملية Timeout إن رغبت فقط ..

بالنسبة لموضوع البروكسي فلا أستطيع إفادتك ، قد يكون للأخوة رأي أفضل ..

بالتوفيق

تم تعديل هذه المشاركة بواسطة م. حسام فيصل في 8 أغسطس 2010 في 12:26

#9

صحيح أخ حسام كما قلت أن يقوم بالتأكد و عند أول موقع يأتي بالنتيجة الصحيحة يتوقف عن البحث في المواقع الأخرى لأن كل موقع يأخذ وقت طول في عملية الريكويست

جزاك الله خير أخي حسام و لجميع الأعضاء المشاركين في الموضوع

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