منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : هل بشرح بسيط عن الـ MultiThread في c#
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبر كاته

هل بشرح بسيط عن الـ MultiThread في c#
بسي شارب خاص لاني اعرف في فيجوال بيسك دوت نت
Lable1.invoke(sub() Label1.text="111")
لكن كيف بالسي شارب لم اجد شرح حولها الا بالكونسول


ونص الخطأ او كل تفاصيله:
PHP كود :
System.ArgumentOutOfRangeException
  HResult
=0x80131502
  Message
=الفهرس خارج النطاقيجب ألا يكون قيمته سالبة ويجب ألا يكون أقل من حجم المجموعة.
اسم المعلمةindex
  Source
=mscorlib
  StackTrace
:
 
  at System.Collections.ArrayList.get_Item(Int32 index)
 
  at System.Windows.Forms.DataGridViewRowCollection.SharedRow(Int32 rowIndex)
 
  at System.Windows.Forms.DataGridView.ScrollRowsByHeight(Int32 height)
 
  at System.Windows.Forms.DataGridView.set_VerticalOffset(Int32 value)
 
  at System.Windows.Forms.DataGridView.DataGridViewVScrolled(Object senderScrollEventArgs se)
 
  at System.Windows.Forms.ScrollBar.OnScroll(ScrollEventArgs se)
 
  at System.Windows.Forms.ScrollBar.DoScroll(ScrollEventType type)
 
  at System.Windows.Forms.ScrollBar.WmReflectScroll(Messagem)
 
  at System.Windows.Forms.ScrollBar.WndProc(Messagem)
 
  at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messagem)
 
  at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messagem)
 
  at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWndInt32 msgIntPtr wparamIntPtr lparam)
 
  at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWndInt32 msgIntPtr wParamIntPtr lParam)
 
  at System.Windows.Forms.Control.SendMessage(Int32 msgIntPtr wparamIntPtr lparam)
 
  at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWndMessagem)
 
  at System.Windows.Forms.Control.WndProc(Messagem)
 
  at System.Windows.Forms.DataGridView.WndProc(Messagem)
 
  at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messagem)
 
  at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messagem)
 
  at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWndInt32 msgIntPtr wparamIntPtr lparam)
 
  at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProcIntPtr hWndInt32 msgIntPtr wParamIntPtr lParam)
 
  at System.Windows.Forms.NativeWindow.DefWndProc(Messagem)
 
  at System.Windows.Forms.Control.DefWndProc(Messagem)
 
  at System.Windows.Forms.Control.WmMouseDown(MessagemMouseButtons buttonInt32 clicks)
 
  at System.Windows.Forms.Control.WndProc(Messagem)
 
  at System.Windows.Forms.ScrollBar.WndProc(Messagem)
 
  at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messagem)
 
  at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messagem)
 
  at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWndInt32 msgIntPtr wparamIntPtr lparam)
 
  at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSGmsg)
 
  at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentIDInt32 reasonInt32 pvLoopData)
 
  at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reasonApplicationContext context)
 
  at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reasonApplicationContext context)
 
  at System.Windows.Forms.Application.Run(Form mainForm)
 
  at WindowsFormsApp1.Program.Main() in E:\vs2022\cs\ExcelBook_cs\ExcelBook_cs\Program.cs:line 29 

الكود المسبب هو:
PHP كود :
           lblrowscount.Invoke((MethodInvoker)delegate lblrowscount.Text "عدد الصفوف المستخدمة: " xlrange.Rows.Count.ToString(); }); 
و كذلك التالي:
PHP كود :
           btndelAll.Invoke((MethodInvoker)delegate btndelAll.Enabled true; }); 
وعليكم السلام ورحمة الله وبركاته

نحتاج أن نعمل لتصريح الاجراء (delegate) كاستينج (أي تحويل نوع) لـ (MethodInvoker)  كي يعمل
أي تكتب :
PHP كود :
Label1.Invoke ((MethodInvokerdelegate 

 
   Label1.Text "111"
}); 


وأظن أنك تعرف أنه بالعادة يكتب ضمن حلقة تكرارية أو دورانية في حدث الـ (DoWork)  للكائن (backgroundWorker).

مثلا الكود : 
PHP كود :
private void backgroundWorker1_DoWork(object senderDoWorkEventArgs e)
{
 
   // مع أدوات عادية
 
   for (int i 0<= 20000i++)
 
   {
 
       label1.Invoke ((MethodInvokerdelegate 
        

 
           label1.Text i.ToString(); 
 
       });


 
   }



ومن أجل عدم التعارض مع أي نداء سابق ولا زال فعال ننده عليه بالكود :
PHP كود :
if (backgroundWorker1.IsBusy != true  // إذا كان حدث الباك جراوند غير مشغول حالياً
{
 
   backgroundWorker1.RunWorkerAsync();


في الكود السابق يبدأ العداد بالعد حتى الغاية المرجوة منه
وأثناء العد فيك أن تطلب تنفيذ أي أمر آخر بالضغط على أي زر آخر أو تطلب مزامنة حدث آخر بعملية أخرى ..

فقط هذا كل شيء.
انا استخدمت void عادي اول واحد وهو الرئيسي استدعيته بالكود التالي:
PHP كود :
           Thread th = new Thread(del);
 
           btndelAll.Enabled false;
 
           if (th.IsAlive == falseth.Start(); 
و اول هذا الاجراء المسمى del يستدعي اجراء Xl
 و في كلا الاجرائين : واحد يسند قيمة لـ Label و الاخر يفعل زر الامر.
هل لابد من استخدام الـBGW
في البرامج العادية لا يلاحظ الفرق، ولا يختلف الأمر كثيراً ..
ولكن بالعادة مع الواجهات يستخدم الـ backgroundWorker ومع الـ العمليات الغير مرئية يستخدم الـ Thread

ينصح بـ backgroundWorker للمبرمجين العاديين
والـ Thread للمحترفين .. 

على أن الـ Thread أكثر دقة في معالجة الخطوط  ولكن عن تجربة وجدت أنه يوجد تداخل غير منظم في حال تم طلب تنفيذ عمليتين معاً ..

فهل الكلام عن الدقة والسرعة هو كلام انشائي أم أنه حقيقي؟؟ (لا أعرف) لأني لم أجرب ولم أختبر ذلك بشكل عملي على مشاريع مناسبة لكل من العمليتين..