C# 多线程相关

进程:

进程(Process)是操作系统中的一个独立实体,是程序执行的一个实例。进程是【系统进行资源分配的基本单位】,是程序运行的环境。每个进程都具有自己的内存空间,包括代码、数据和堆栈等,这些资源是独立的,进程之间的数据通常是隔离的。

线程:

概念:

线程(Thread)是操作系统能够进行【运算调度的最小单位】,是进程中的实际运作单位。线程必须包含在进程中。一条线程指的是进程中一个单一顺序的控制流,进程中可以包含多个线程。

特点:

1.每个线程独立于其他线程运行。

2.多个线程可以同时执行,提高了程序的执行效率。

3.线程可以共享进程的资源。

进程与线程的关系:

1.进程包含线程,一个进程中可以并发多个线程,这些线程共享进程的资源,但执行各自的任务。

2.线程不能独立运行,进程是线程的容器,线程在进程中运行。

线程状态:

Unstarted

尚未对线程调用Start()方法
Running 线程已启动且尚未停止
Stopped 线程以停止执行
Suspended 线程以挂起
Background 线程正作为后台线程执行,后台线程在所有前台线程都结束时会立即终止
WaitSleepJoin 线程因调用WaitSleepJoin而被阻塞
AbortRequested 已对线程调用了Abort方法,但线程尚未接收到终止的信号
Aborted 线程响应Abort请求并终止执行
StopRequested 正在请求线程停止,这是一个内部状态

线程优先级:

Lowest 线程可以被安排在其他任何优先级的线程之后执行
BelowNormal 线程可以被安排在具有Normal优先级的线程之后,在具有Lowest优先级的线程之前执行
Normal 默认的线程优先级
AboveNormal 线程可以被安排在具有High优先级的线程之后,在具有Normal优先级的线程之前执行
Highest 线程可以被安排在具有任何其他优先级的线程之前执行
线程实例化:

线程可以通过Thread类实例化

 public Form1()
{    
       Thread thread1 = new Thread(() => 
       {
          Console.WriteLine("线程做的具体的工作,工作一般比较耗时");
          Console.WriteLine("将来也有可能把耗时的任务封装成方法");
       });

       Thread thread2 = new Thread(DoWork);
}


public void DoWork()
{
       Console.WriteLine("线程正在运行...");
}

跨线程访问:

主线程中的控件修改,重新赋值推荐使用Invoke()方法

Thread thread;

//按钮点击事件
private void button1_Click(object sender, EventArgs e)
{
    thread = new Thread(() =>
    {
          Invoke(new Action(() =>  { button1.Text = "hello"; }));
    });
}
向线程传递参数:

使用Thread类的构造函数可以向线程传递参数。下面的示例展示了如何使用ParameterizedThreadStart

 public Form1()
 {
       object str = "you";
       Thread thread = new Thread(new ParameterizedThreadStart(DoWork));
       thread.Start(str);
 }

 void DoWork(object data)
 {
       Console.WriteLine(data);
 }
线程管理:
Thread thread;
bool isCancel=false;//取消标识

public Form1()
{
      //创建线程
      thread = new Thread(() => {

       while(true)
       {
          Console.WriteLine("abc");
       }
      });
}    
        
private void button1_Click(object sender, EventArgs e)
{
      thread?.Start();//启动线程
}

private void button2_Click(object sender, EventArgs e)
{
      thread?.Suspend();//暂停线程
}

private void button3_Click(object sender, EventArgs e)
{
      thread?.Resume();//继续线程
}

private void button4_Click(object sender, EventArgs e)
{
      isCancel = true;//把取消标识设成true之后,表示分线程中执行任务已经完成
      thread?.Abort();//中止线程
}

多线程:

概念:

多线程是指让程序同时运行多个线程来执行不同的任务,多个线程并行执行(执行时无顺序)。

优点:

1.线程可同时执行多个任务,提高程序的响应速度。

2.充分利用多核处理器,提高了程序性能。

3.可以将任务分解成多个线程,使得代码结构更加清晰,便于维护和复用

缺点:

1.线程运行需要占用计算机资源,线程越多占用资源也越多。(占内存多)

2.多线程需要协调和管理,所以需要CPU跟踪线程,消耗CPU资源。(占cpu多)

3.多线程存在资源共享问题。

4.线程太多会导致控制太复杂,管理麻烦,容易产生bug。

线程池:

概念:

线程池(ThreadPool)是一个由.NET Framework提供的管理多个线程的机制。线程池中可以存在多个线程,让线程池来自动管理。线程池中的线程是后台线程,它们在完成任务后会返回到线程池中等待下一个任务,而不是被销毁,这样可以减少创建和销毁线程的开销。

       //开启线程
       private void button1_Click(object sender, EventArgs e)
        {
            //WaitCallback===public delegate void WaitCallback(object state);
            ThreadPool.QueueUserWorkItem((state) =>
            {
                Console.WriteLine(state);
            }, "abc1");

            ThreadPool.QueueUserWorkItem((state) =>
            {
                Console.WriteLine(state);
            }, "abc2");

            ThreadPool.QueueUserWorkItem((state) =>
            {
                Console.WriteLine(state);
            }, "abc3");
        }

        //线程等待
        private void button2_Click(object sender, EventArgs e)
        {
            ManualResetEvent resetEvent = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(o =>
            {
                // 分线程的代码是有序,线程和其他线程的执行是无序,想有序借助优先级。
                this.DoSomething(o.ToString());
                resetEvent.Set();
            }, "张三");
            resetEvent.WaitOne();// 阻塞,等待Set()执行,才执行以下的代码
            Console.WriteLine("AAAAAA");
        }

        private void DoSomething(string s)
        {
            Thread.Sleep(10000);
            Console.WriteLine(s);
        }
优点:

解决了部分Thread管理不便的问题,移除了无用的Thread API。提高了线程运行性能。

你可能感兴趣的:(C#,高级教程,c#)