Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में थ्रेड को समाप्त करना (Kill/Stop)

महत्वपूर्ण: .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 पसंद करें।
  1. - C# में वर्तमान थ्रेड का नाम प्रदर्शित करना

    C# में Thread.Name प्रॉपर्टी का उपयोग करके थ्रेड को एक पहचान नाम दिया जा सकता है, जो डीबगिंग और लॉगिंग में बहुत उपयोगी होता है। उदाहरण using System; using System.Threading; namespace Demo { class MyClass { static void Main(string[] args) { Thread thread = Thread.CurrentThre

  1. - C# में बबल सॉर्ट (Bubble Sort) प्रोग्राम

    बबल सॉर्ट एक सरल सॉर्टिंग एल्गोरिदम है। यह सॉर्टिंग एल्गोरिदम तुलना-आधारित एल्गोरिदम है जिसमें आसन्न एलिमेंट्स के प्रत्येक जोड़े की तुलना की जाती है और यदि वे क्रम में नहीं हैं तो उन्हें स्वैप किया जाता है।मान लीजिए हमारे int ऐरे में 5 एलिमेंट्स हैं:int[] arr = { 78, 55, 45, 98, 13 };अब, बबल सॉर्ट क

  1. - C# प्रोग्राम: वर्तमान थ्रेड की स्थिति जांचें

    C# में वर्तमान थ्रेड की स्थिति जांचने के लिए IsAlive प्रॉपर्टी का उपयोग करें।सबसे पहले, थ्रेड के बारे में जानकारी प्रदर्शित करने के लिए currentThread प्रॉपर्टी का उपयोग करें:Thread thread = Thread.CurrentThread;अब थ्रेड की स्थिति जांचने के लिए thread.IsAlive प्रॉपर्टी का उपयोग करें:thread.IsAliveउदा