महत्वपूर्ण: .NET में Thread.Abort() मेथड अप्रचलित (obsolete) है और इसका उपयोग नहीं करना चाहिए क्योंकि यह अप्रत्याशित व्यवहार और संसाधन लीक का कारण बन सकता है।
सही दृष्टिकोण: कैंसिलेशन टोकन/फ्लैग पैटर्न
थ्रेड को सुरक्षित रूप से रोकने के लिए एक शेयर्ड फ्लैग (या CancellationToken) का उपयोग करें जिसे थ्रेड समय-समय पर जांचता है।
उदाहरण: फ्लैग-आधारित ग्रेसफुल स्टॉप
using System;
using System.Threading;
class Demo {
static void Main(string[] args) {
MyClass c = new MyClass();
// नया थ्रेड
Thread thread = new Thread(c.Display);
thread.Start();
Console.WriteLine("Press any key to exit!");
Console.ReadKey();
// थ्रेड को रुकने का सिग्नल दें
c.Stop();
// थ्रेड के समाप्त होने की प्रतीक्षा करें
thread.Join();
}
}
public class MyClass {
private bool _stopFlag = false;
public void Display() {
while (!_stopFlag) {
Console.WriteLine("It's Working");
Thread.Sleep(2000);
}
}
public void Stop() {
_stopFlag = true;
}
}
आउटपुट
It's Working Press any key to exit!
(की दबाने के बाद थ्रेड ग्रेसफुली रुक जाता है)
आधुनिक दृष्टिकोण: CancellationToken
using System;
using System.Threading;
using System.Threading.Tasks;
class Program {
static void Main() {
var cts = new CancellationTokenSource();
var token = cts.Token;
Task.Run(() => DoWork(token), token);
Console.WriteLine("Press any key to stop...");
Console.ReadKey();
cts.Cancel(); // कैंसिलेशन का अनुरोध
}
static void DoWork(CancellationToken token) {
while (!token.IsCancellationRequested) {
Console.WriteLine("Working...");
Thread.Sleep(1000);
}
Console.WriteLine("Stopped gracefully.");
}
}
Thread.Abort() क्यों नहीं?
ThreadAbortExceptionफेंकता है जिसे पकड़ा जा सकता है लेकिन स्वचालित रूप से पुन: फेंका जाता है।- अनमैनेज्ड संसाधनों को ठीक से साफ नहीं कर सकता।
- लॉक्स को छोड़ सकता है, जिससे डेडलॉक हो सकता है।
- .NET Core / .NET 5+ में समर्थित नहीं।
सर्वोत्तम अभ्यास
- हमेशा कोऑपरेटिव कैंसिलेशन (फ्लैग या CancellationToken) का उपयोग करें।
thread.Join()का उपयोग करके थ्रेड के समाप्त होने की प्रतीक्षा करें।- लंबे समय तक चलने वाले ऑपरेशन्स के लिए
TaskऔरCancellationTokenपसंद करें।