C#多线程

记录一下初接触多线程学到的创建多线程,感觉有点像调用方法,但是不同的是可以同时进行不用排队了,可不是嘛,多线程的作用就是这样啊,哈哈哈哈哈,看看我找的代码

using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {

        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("Main:创建子线程");
            Thread childThread = new Thread(childref);
            childThread.Start();
            // 停止主线程一段时间
            Thread.Sleep(2000);
            // 现在中止子线程
            Console.WriteLine("Main:中止子线程");
            childThread.Abort();
            Console.ReadKey();
        }

        public static void CallToChildThread()
        {
            try
            {
                Console.WriteLine("子线程开始");
                // 计数到 10
                for (int counter = 0; counter <= 10; counter++)
                {
                    Thread.Sleep(500);
                    Console.WriteLine(counter);
                }
                Console.WriteLine("子线程完成");
            }
            catch (ThreadAbortException e)
            {
                Console.WriteLine("线程中止异常");
            }
            finally
            {
                Console.WriteLine("无法捕获线程异常");
            }

        }
    }
}

这串代码是在控制台写的,在这里

 

进去后有个默认的类,把里边的代码删掉粘贴上这段代码按F5就可以看到运行结果 ,我这里好像出了点错误,但是可以证明确实是多线程运行了

 

 

 其中输出0、1、2都是子线程的方法,他们是在主线程休息那2秒钟的期间输出的,如果不理解可以这样改一下看看效果

 

这里就是关掉线程,把 CallToChildThread当做一个普通方法来调用,就不会存在在主线程休息的时候执行CallToChildThread()方法

CallToChildThread()方法会等主线程执行完毕之后,也就是输出“Main:中止子线程”之后再开始陆续输出0—10,执行结果是这样

现在明白了吧,没错我明白了哈哈哈

 还有这个应该是线程被中止时可以捕获到吧,但是我不知道为什么没执行成功

 


 

关于ThreadStart和Thread的区别关系,可以看一下这段

     //以下称为前者  
   ThreadStart childref = new ThreadStart(CallToChildThread);
    Thread childThread = new Thread(childref);
    //以下称为后者
   Thread childThread = new Thread(CallToChildThread);

两者是没有任何区别的。
前者是c#的语法。后者是编译器帮改的;
.net中根本不支持 new Thread(childref); 这种代码是c#编译器支持的。

也就是说C#编译器把你写的不支持.net的东西(后者)编译成支持.net的(前者)然后再.net上运行。
在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,可以把ThreadStart理解为一个函数指针,指向线程要执行的函数

当调用C# Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。

ThreadStart是一个委托。虽然它叫Thread,但是它其实是一个普普通通的委托类型。
就好比
button1.Click += button1_Click;

button1.Click += new EventHandler(button1_Click);

 


 

发现一个大佬写的C#多线程,写的太好了可以去看看!

https://www.cnblogs.com/luxiaoxun/p/3280146.html

 

posted @ 2022-04-13 16:39  给自己个晚安  阅读(148)  评论(0编辑  收藏  举报