कभी भी Thread.Suspend
का उपयोग न करें। इसके साथ बड़ी समस्या यह है कि 99% बार आप यह नहीं जान सकते कि वह थ्रेड क्या कर रहा है जब आप इसे निलंबित करते हैं। यदि उस धागे में ताला लगा है, तो आप डेडलॉक स्थिति में प्रवेश करना आसान बनाते हैं, ध्यान रखें कि जिस कोड को आप कॉल कर रहे हैं वह दृश्यों के पीछे ताले को प्राप्त/रिलीज़ कर सकता है। Win32 में एक समान API है: SuspendThread
और ResumeThread
।
http://msdn.microsoft.com/en-us/library/ms686345(VS.85).aspx
इस समारोह में मुख्य रूप से डिबगर द्वारा उपयोग के लिए बनाया गया है: SuspendThread
निम्नलिखित डॉक्स एपीआई के खतरों का एक अच्छा सारांश देती हैं। यह थ्रेड सिंक्रनाइज़ेशन के लिए इस्तेमाल नहीं किया जाना है। सिंक्रनाइज़ेशन ऑब्जेक्ट का मालिक होने वाले थ्रेड पर सस्पेंड थ्रेड, जैसे म्यूटेक्स या महत्वपूर्ण सेक्शन, एक डेडलॉक का कारण बन सकता है यदि कॉलिंग थ्रेड एक निलंबित थ्रेड के स्वामित्व वाली सिंक्रनाइज़ेशन ऑब्जेक्ट प्राप्त करने का प्रयास करता है। इस स्थिति से बचने के लिए, एक ऐसे अनुप्रयोग के भीतर एक धागा जो डीबगर नहीं है, उसे अन्य थ्रेड को खुद को निलंबित करने का संकेत देना चाहिए। लक्ष्य धागा को इस सिग्नल को देखने और उचित प्रतिक्रिया देने के लिए डिज़ाइन किया जाना चाहिए।
अनिश्चित काल तक थ्रेड को निलंबित करने का उचित तरीका ManualResetEvent
का उपयोग करना है। थ्रेड सबसे अधिक संभावना है, कुछ काम कर रहा है। धागा को निलंबित करने का सबसे आसान तरीका है, धागा है प्रत्येक यात्रा "जाँच" घटना के लिए इतना की तरह है:
while (true)
{
_suspendEvent.WaitOne(Timeout.Infinite);
// Do some work...
}
आप एक अनंत समय समाप्ति निर्दिष्ट इसलिए जब घटना का संकेत नहीं है, धागा अनिश्चित काल के लिए अवरुद्ध कर देगा जब तक घटना संकेत दिया जाता है कि किस बिंदु पर थ्रेड फिर से शुरू होगा जहां यह छोड़ा गया था।
तुम इतनी तरह घटना बनाने होगा:
ManualResetEvent _suspendEvent = new ManualResetEvent(true);
true
पैरामीटर घटना बताता संकेत राज्य में बाहर शुरू करने के लिए।
आप धागा रोकना चाहते हैं, तो आप निम्न है:
_suspendEvent.Reset();
और धागा फिर से शुरू करने:
_suspendEvent.Set();
आप बाहर निकलने के लिए धागा संकेत करने के लिए इसी तरह की एक प्रणाली का उपयोग कर सकते हैं और दोनों घटनाओं पर इंतजार करें, यह पता लगाने के लिए कि कौन सी घटना संकेतित की गई थी।
बस मस्ती के लिए मैं एक पूर्ण उदाहरण उपलब्ध कराएँगे:
public class Worker
{
ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
ManualResetEvent _pauseEvent = new ManualResetEvent(true);
Thread _thread;
public Worker() { }
public void Start()
{
_thread = new Thread(DoWork);
_thread.Start();
}
public void Pause()
{
_pauseEvent.Reset();
}
public void Resume()
{
_pauseEvent.Set();
}
public void Stop()
{
// Signal the shutdown event
_shutdownEvent.Set();
// Make sure to resume any paused threads
_pauseEvent.Set();
// Wait for the thread to exit
_thread.Join();
}
public void DoWork()
{
while (true)
{
_pauseEvent.WaitOne(Timeout.Infinite);
if (_shutdownEvent.WaitOne(0))
break;
// Do the work here..
}
}
}
मैं जाकर कि ebook पढ़ने के लिए होगा। मुझे सस्पेंड/खुद को फिर से शुरू करने में कभी समस्या नहीं हुई है। –