تمت الإجابة كيف أوقف الثريد ThreadPool

تم تحميل الصفحة في 0,9081480 ثانية
كيف أوقف الثريد ThreadPool
الحالة
مغلق و غير مفتوح للمزيد من الردود.
إنضم
2 نوفمبر 2012
المشاركات
3,482
الإعجابات
2,944
النقاط
113
العمر
31
الإقامة
Algeria
السلام عليكم ورحمة الله وبركاته

أريد طريقة لايقاف

ThreadPool.QueueUserWorkItem

ان أمكن

جربت ولكن دون فائدة لا يحصل شيء

C#:
Use a CancellationToken and pass it on to the QueueUserWorkItem method.

var cts = new CancellationTokenSource();

ThreadPool.QueueUserWorkItem(tok =>
{
    CancellationToken token = (CancellationToken) tok;
    while (!token.IsCancellationRequested)
    {
        // do stuff
    }
}, cts.Token);



Then call:

cts.Cancel();


when you want to stop your while loop.

Even better would be to use a Task instead along with a CancellationToken.
 

عـبـدالـله

.:: أبو مـحـمـد ::.
rankrankrankrankrank
إنضم
5 ديسمبر 2013
المشاركات
2,339
الإعجابات
3,100
النقاط
198
كان ودي اساعدك لكن للاسف ليس لدي فيجوال استديو

على العموم الشرط في while اذا لم يكن Thead ملغي تتم عملية التكرار

فا التوقيف يكون قبل الـ while وليس بداخل الـ while

او قم بتغيير الـ while تضع بداخله شرط if

C#:
 while (True)
    {
         cts.cancel();
        if(!token.IsCancellationRequested){
            // code
        }
         break;
    }
يكون بهذا الشكل او تقوم بعمل
token.cancel() قبل الـ while


لان اذا لم يكن ملغي قم بعملية التكرار while


اعتذر منك اخي العزيز ليس لدي فيجوال ستديو
 

;Null

Beginner Developer
rank
إنضم
18 أكتوبر 2016
المشاركات
75
الإعجابات
82
النقاط
18
كود:
var token = (CancellationToken)tkn;
while (true)
{

    if(token.IsCancellationRequested) break;
}

ومثل ما قال لك
يفضل ان تستخدم ال task

كود:
Task.Run(() => {
  while(true)
  {
    if(token.IsCancellationRequested) break;
   
  }
}, token);
لعده اسباب ومنها ان ال task بيعطى
ال exceptions
التى وقعت
و يعطى exception يسمى
OperationCancelledException
ليعلمك بانه تم انهاءه
 
إنضم
2 نوفمبر 2012
المشاركات
3,482
الإعجابات
2,944
النقاط
113
العمر
31
الإقامة
Algeria
كان ودي اساعدك لكن للاسف ليس لدي فيجوال استديو

على العموم الشرط في while اذا لم يكن Thead ملغي تتم عملية التكرار

فا التوقيف يكون قبل الـ while وليس بداخل الـ while

او قم بتغيير الـ while تضع بداخله شرط if

C#:
 while (True)
    {
         cts.cancel();
        if(!token.IsCancellationRequested){
            // code
        }
         break;
    }
يكون بهذا الشكل او تقوم بعمل
token.cancel() قبل الـ while


لان اذا لم يكن ملغي قم بعملية التكرار while


اعتذر منك اخي العزيز ليس لدي فيجوال ستديو
أخي عبد الله الكود علط للأسف
أنت وضعت أمر النداء داخل حلقة التكرار while وستقوم باغلاق الثريد في كل مرة د
cts.cancel();
أنا أريد ايقافه من خلال الضغط على زر أخر
 
إنضم
2 نوفمبر 2012
المشاركات
3,482
الإعجابات
2,944
النقاط
113
العمر
31
الإقامة
Algeria
كود:
var token = (CancellationToken)tkn;
while (true)
{

    if(token.IsCancellationRequested) break;
}

ومثل ما قال لك
يفضل ان تستخدم ال task

كود:
Task.Run(() => {
  while(true)
  {
    if(token.IsCancellationRequested) break;
  
  }
}, token);
لعده اسباب ومنها ان ال task بيعطى
ال exceptions
التى وقعت
و يعطى exception يسمى
OperationCancelledException
ليعلمك بانه تم انهاءه
شكرا أخي Null;
قمت بتجربة Task لكن دون جدوى
لا يعمل الكود ولا يحدث أي خطأ!


 

عـبـدالـله

.:: أبو مـحـمـد ::.
rankrankrankrankrank
إنضم
5 ديسمبر 2013
المشاركات
2,339
الإعجابات
3,100
النقاط
198
بما انك نريد ايقافه من خلال زر اخر ضع امر الايقاف في الزر المطلوب

واضافة if في الكود الرئيسي

اذا تم الضغط على زر الايقاف قم بأيفاف الكود

يعني كمثال


كود:
if(is_clicked()){
            //here code
}

واكرر لا يوجد لدي فيجوال ستديو

انتظر الاعضاء ان شاء الله يساعدونك
 

;Null

Beginner Developer
rank
إنضم
18 أكتوبر 2016
المشاركات
75
الإعجابات
82
النقاط
18
اعتقد ان المشكله تكمن فى كون grabber
CPU bound operation او بمعنى اخر
Blocking code
اى اقصد انها تحتاج وقت طويل جدا لكى تنتهى
لذا لا تنتقل لسطر while اللذى يتاكد من الغاء العملية

لذا عليك بتمرير ال token ايضا ل
grabber
وتضع هذا الشرط
كود:
if(token.IsCancellationRequested)
    token.ThrowIfCancellationRequested();
حيث تضمن ان يتم نداءه من حين للاخر
وتمسح جزء while

وايضا تحول grabber
ل asynchronous operation

اذا كانت لغتك الانجليزية جيدا اقرأ هذا المقال
Async and Await
وكتاب
async c# 5.0
وبعد فهم اهمية الtasks ولما تم صنعها فى الاساس
مع وجود ال threads
ستسطيع استخدام cancellation token
 

;Null

Beginner Developer
rank
إنضم
18 أكتوبر 2016
المشاركات
75
الإعجابات
82
النقاط
18
اعرف انى لم و لن افيدك بشكل كامل لانى لم اقرا مشروعك وحتى لذا قرأته وعدلت عليه
لم يكون هناك نفع لك لذا انصحك بالقرأه والتعمق بالموضوع
واستخدم ال threads فى المشاريع الاساسيه
حتى تتعلم الtasks وتتقن استخدامها

ايضا الفيديو هذا فيه معلومات قيمة لك *بالانجليزية*
الجزء الثانى
 
إنضم
2 نوفمبر 2012
المشاركات
3,482
الإعجابات
2,944
النقاط
113
العمر
31
الإقامة
Algeria
بما انك نريد ايقافه من خلال زر اخر ضع امر الايقاف في الزر المطلوب

واضافة if في الكود الرئيسي

اذا تم الضغط على زر الايقاف قم بأيفاف الكود

يعني كمثال

كود:
if(is_clicked()){
            //here code
}
واكرر لا يوجد لدي فيجوال ستديو

انتظر الاعضاء ان شاء الله يساعدونك
احييك أخي عبد الله على المساعدة رغم انك لا تملك فيجوال ستيديو
شكرا اخي الحبيب.
 
إنضم
2 نوفمبر 2012
المشاركات
3,482
الإعجابات
2,944
النقاط
113
العمر
31
الإقامة
Algeria
اعتقد ان المشكله تكمن فى كون grabber
CPU bound operation او بمعنى اخر
Blocking code
اى اقصد انها تحتاج وقت طويل جدا لكى تنتهى
لذا لا تنتقل لسطر while اللذى يتاكد من الغاء العملية

لذا عليك بتمرير ال token ايضا ل
grabber
وتضع هذا الشرط
كود:
if(token.IsCancellationRequested)
    token.ThrowIfCancellationRequested();
حيث تضمن ان يتم نداءه من حين للاخر
وتمسح جزء while

وايضا تحول grabber
ل asynchronous operation

اذا كانت لغتك الانجليزية جيدا اقرأ هذا المقال
Async and Await
وكتاب
async c# 5.0
وبعد فهم اهمية الtasks ولما تم صنعها فى الاساس
مع وجود ال threads
ستسطيع استخدام cancellation token
احسنت اخي هذا هو الحل الصحيح

لذا عليك بتمرير ال token ايضا لgrabber

حتى نضمن نداءه كل فترة
كنت قد قرأت كتب واخذت دورة حول الثريد والتاسك لكن عند التطبيق اقع في مشاكل
ويكون الحل الا باستشارة خبراء امثالكم.
فجزاكم الله خيرا
شكرا على الكتاب سأضطلع عليه قريبا (مشكلتي الوحيدة اني امل من قراءة الكتب الطويلة)
 
الإعجابات: ;Null
الحالة
مغلق و غير مفتوح للمزيد من الردود.

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

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

إرجاع خيارات الإستايل