C# 多线程

C# 多线程

一、线程开启方式1-Thread类

(1) 传递参数 1 start()中传递参数:

		static void Download(object filename)
        {
            Console.WriteLine(filename+"下载开始" +Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
            Console.WriteLine("下载结束");
        }
        static void Main(string[] args)
        {
            Thread t = new Thread(Download);
            t.Start("XXX.txt");

            Console.WriteLine("Main");
            Console.ReadKey();
        }

线程方法传递参数1

(2) 传递参数 2 调用类中的方法

		static void Main(string[] args)
        {
            MyThread myThread = new MyThread("XXX.txt", "http://www.baidu.com");
            Thread thread =new Thread(myThread.DownLoad);
            thread.Start();
            Console.WriteLine("Main");
            Console.ReadKey();
        }
        public class MyThread
        {
            private string filename;
            private string filepath;
            public MyThread(string filename,string filepath)
            {
                this.filename = filename;
                this.filepath = filepath;
            }
            public void DownLoad()
            {
                Console.WriteLine(filename + filepath + "下载开始");
                Thread.Sleep(2000);
                Console.WriteLine("下载结束");
            }
        }

传递参数方法2

(3) 后台线程、前台线程、线程的状态

  • 判断一个应用程序是否结束需要判断前台线程是否都运行结束。当多个前台线程在运行时,如果main方法运行结束了,只要有一个前台线程在运行,应用程序的进程任然是运行的。
    用Thread创建的是前台线程,线程池中的线程总是后台线程。当所有前台线程运行完毕,后台线程也会终止。
// 如何把线程设置为后台线程
thread.IsBackground = true;
  • 使用Abort()方法可以停止线程,调用这个方法会抛出异常,可以根据try…catch这个异常在线程结束前做一些清理工作。
  • 如果需要等待线程的结束,调用Join()方法,即停止当前线程,把线程join进来,执行完后执行后续代码。
  • 线程的基本状态有就绪、阻塞、运行三种。

二、线程开启方式2-线程池

  • 线程池的线程调用的方法必须有一个参数
  • 线程池中的线程都是后台线程
  • 线程池中的线程不能改为前台线程
        static void ThreadMethod(object state)
        {
            Console.WriteLine("线程开始 id"+Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
            Console.WriteLine("线程结束");
        }
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);

            Console.WriteLine("Main");
            Console.ReadKey();
        }

线程池创建线程

三、线程开启方式3-任务

			// 任务创建的方法-创建一个Task实例
			Task t = new Task(ThreadMethod);
            t.Start();
            // 任务创建的方法-实例化TaskFactory类
			TaskFactory tf = new TaskFactory();
            tf.StartNew(ThreadMethod);
            // 任务创建的方法-Factory属性
			Task tf = Task.Factory.StartNew(ThreadMethod);

任务开启线程

四、线程问题-争用条件和死锁

争用条件:当多个线程同时访问同一数据时,每个线程都尝试操作改数据,从而导致数据被破坏,这种现象称为争用条件。
解决:加锁lock,只能锁定引用类型,在同一时刻只有一个线程在对同一个数据进行访问。
死锁:如果执行操作需要两个资源,当两个线程分别锁定两个资源,都在等待另一个线程执行完毕释放资源,此时就会造成死锁。
解决死锁:设定锁定顺序(不知道另一种方法可不可以:在等待一段时间后同时释放锁定的资源)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值