中止.NET线程

Jai*_*Jai 3 .net c#

我正在创建一个线程A并在该线程中创建一个新线程B.

那么线程层次结构如何?线程B是线程A的子节点?或者线程是作为同伴创建的?

我想中止父线程A,后者又杀死/中止其子线程.

这怎么可能在C#中?

Mar*_*ell 11

理想情况下,线程永远不会被中止.这根本不安全.将此视为一种解决已经生病的过程的方法.否则,避免像瘟疫一样.

这样做的更正确的方法是拥有代码可以定期检查的东西,并且自己决定退出.


Lau*_*stN 6

以礼貌的方式停止线程的一个例子:

using System;
using System.Threading;

namespace Treading
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main program starts");
            Thread firstThread = new Thread(A);
            ThreadStateMessage messageToA = new ThreadStateMessage(){YouShouldStopNow = false};
            firstThread.Start(messageToA);
            Thread.Sleep(50); //Let other threads do their thing for 0.05 seconds
            Console.WriteLine("Sending stop signal from main program!");
            messageToA.YouShouldStopNow = true;
            firstThread.Join();
            Console.WriteLine("Main program ends - press any key to exit");
            Console.Read();//
        }

        private class ThreadStateMessage
        {
            public bool YouShouldStopNow = false; //this assignment is not really needed, since default value is false
        }

        public static void A(object param)
        {
            ThreadStateMessage myMessage = (ThreadStateMessage)param;
            Console.WriteLine("Hello from A");
            ThreadStateMessage messageToB = new ThreadStateMessage();
            Thread secondThread = new Thread(B);
            secondThread.Start(messageToB);

            while (!myMessage.YouShouldStopNow)
            {
                Thread.Sleep(10);
                Console.WriteLine("A is still running");
            }

            Console.WriteLine("Sending stop signal from A!");
            messageToB.YouShouldStopNow = true;
            secondThread.Join();

            Console.WriteLine("Goodbye from A");
        }

        public static void B(object param)
        {
            ThreadStateMessage myMessage = (ThreadStateMessage)param;
            Console.WriteLine("Hello from B");
            while(!myMessage.YouShouldStopNow)
            {
                Thread.Sleep(10);
                Console.WriteLine("B is still running");
            }
            Console.WriteLine("Goodbye from B");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Thread.Abort(); 如果您的线程处于任何类型的等待状态,则会引发异常.这有点烦人,因为线程有很多种方式可以等待.正如其他人所说,你通常应该避免这样做.