2010-08-11 14 views
11

क्या सी # में सोने के धागे को जगाने का कोई तरीका है? तो, क्या यह लंबे समय तक सो रहा है और जब आप काम संसाधित करना चाहते हैं तो इसे जगाएं?क्या सोने के धागे को जगाने का कोई तरीका है?

+0

वास्तव में कौन सी सेटिंग में? हमें वास्तव में प्लेटफॉर्म और/या थ्रेडिंग मॉडल के बारे में कुछ और जानकारी चाहिए जो आप इसका अर्थपूर्ण उत्तर देने में सक्षम होने के लिए उपयोग कर रहे हैं। – Gian

+0

यह इस बात पर निर्भर करता है कि आप इसे कैसे सोते हैं। – zneak

+1

आपको कम से कम हमें यह बताना होगा कि इस प्रश्न के बारे में प्रोग्रामिंग भाषा क्या है। – scy

उत्तर

14

एक AutoResetEvent वस्तु (या किसी अन्य WaitHandle कार्यान्वयन) सोने के लिए इस्तेमाल किया जा सकता जब तक एक और धागा से एक संकेत प्राप्त होता है:

// launch a calculation thread 
var waitHandle = new AutoResetEvent(false); 
int result; 
var calculationThread = new Thread(
    delegate 
    { 
     // this code will run on the calculation thread 
     result = FactorSomeLargeNumber(); 
     waitHandle.Set(); 
    }); 
calculationThread.Start(); 

// now that the other thread is launched, we can do something else. 
DoOtherStuff(); 

// we've run out of other stuff to do, so sleep until calculation thread finishes 
waitHandle.WaitOne(); 
3

यदि आपका धागा Sleep पर कॉल के अंदर है, तो इसे (आमतौर पर) जागने का कोई तरीका नहीं है। (एकमात्र अपवाद मैं के बारे में पता कर रहा हूँ जावा, जो अगर कुछ अन्य धागा कॉल thread.interrupt() एक नींद जल्दी समाप्त किया जा करने की अनुमति देता है।)

पैटर्न है कि आप के बारे में बात कर रहे हैं एक घटना के लिए कॉल करने के लिए लगता है: धागा होता है एक लूप, जिस पर यह आग लगने के लिए इंतजार कर रहा है। यदि ईवेंट वर्तमान में सेट नहीं है, तो थ्रेड "सोता है" जब तक कि कुछ अन्य थ्रेड घटना को सक्रिय नहीं करते हैं। उस समय, नींद का धागा उठता है और अगली बार लूप के माध्यम से जब तक यह किसी अन्य घटना की प्रतीक्षा करने के लिए सो जाता है, तब तक अपना काम जारी रखता है।

+0

@ जॉन, आपने अपनी टिप्पणी जोड़ दी, जबकि मैं उस जानकारी को जोड़ने के लिए संपादन कर रहा था :)। –

+0

काफी मेला मैं अपनी टिप्पणी हटा दूंगा :) –

0

this धागा सहायता होगी? थ्रेड इवेंट हैंडलिंग के लिए सी # good functionality है। मैंने पाइथन में अपना अधिकांश काम किया है, लेकिन सी # थ्रेड अवरुद्ध करने के लिए ठोस पुस्तकालयों में प्रतीत होता है।

1

सबसे अच्छा समाधान डिफ़ॉल्ट TaskFactory साथ Task वस्तुओं का उपयोग करने के लिए होगा। यह एपीआई (.NET 4.0 में पेश की गई) काम-चोरी कतारों और सभी फैंसी सामान के साथ थ्रेड के पूल का उपयोग करती है।

यदि .NET 4.0 उपलब्ध नहीं है, तो ThreadPool का उपयोग करें, जिसमें एक अंतर्निहित कार्य कतार है (जो कुछ पूल संतुलन करता है लेकिन 4.0 थ्रेड पूल के समान स्कोप पर नहीं)।

यदि आप वास्तव में यह स्वयं करते हैं, तो मैं BlockingCollection<T> की अनुशंसा करता हूं, जो .NET 4.0 में अवरुद्ध उपभोक्ता/निर्माता कतार है।

तुम सच में चाहिए यह करते हैं अपने आप को और .NET 4.0 उपयोग नहीं कर सकते, तो आप काम का एक lock -protected कतार के साथ एक ManualResetEvent या AutoResetEvent उपयोग कर सकते हैं।

3
public void WakeUp() 
{ 
    if (Thread.CurrentThread.ThreadState == ThreadState.WaitSleepJoin) 
    Thread.CurrentThread.Interrupt(); 
} 
+1

यह धागा को रोक देगा और इसे जगाएगा नहीं। – Danpe

+1

@ डैनपे मुझे संदेह है कि यह धागे को रोकता है, तो इसे एक बाधा कहने का क्या मतलब होगा। इसे पढ़ें: http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt(v=vs.110).aspx आपको अपवाद पकड़ना होगा। –

+0

यह नहीं है कि आप ओपी क्या पूछ रहे हैं उसे पूरा करते हैं। थ्रेड कोड में एक निश्चित "प्रतीक्षा" बिंदु होना चाहिए जहां यह ओएस को थ्रेड प्रोसेसिंग को फिर से प्राप्त करने के लिए संकेत देता है। 'स्लीप' या 'स्पिनवाइट' या 'यील्ड' के लिए कोई भी कॉल थ्रेड को 'वेटस्लीप जॉइन' स्थिति में रखेगा। – Slight

संबंधित मुद्दे