C#线程学习

多线程

  • 进程:Process类--就是C#程序中的一个进程类,一个正在运行的应用程序在操作系统中可以认为是一个进程,包含了一个运行程序所需要的内存资源

    该进程一般包含一个或者多个线程,但至少有一个线程。

    进程之间是相互独立的,一个进程无法访问到另一个进程里的数据资源的,在进程当中可以有多个线程同时执行代码,一个进程的运行失败并不会影响其他进程的运行

  • 线程:Thread类--就是C#程序中的一个线程类,线程是操作系统分配处理器时间的基本单元,一个进程可以包含多个线程,在多个线程当中需要确定一个主线程,在进程入口执行的第一个线程一般被认为是这个进程的主线程。在.Net应用程序中,都是以Main()方法作为程序的入口,调用这个Main()方法的那个线程我们称之为主线程。

    线程在操作系统当中主要有三块内存区域构成的:CPU寄存器(记录当前线程的状态),调用栈(维护线程执行的内存与数据),线程本地存储器(Thread Local Storage)TLS---存储线程的状态信息)

    后台线程(守护线程):后台线程是通过前台线程设置转换过来的,只有当所有的前台线程结束,与之关联的后台线程才会自动结束

    前台线程:默认启动的线程都是前台线程,默认使用Thread类创建的线程都是前台线程,当应用程序当中所有的前台线程结束,此时该应用程序才会结束关闭。

  • 同步:分开执行,one by one 多个线程按照顺序依次执行,每次执行一个线程,不能跳跃,前面的线程没有执行完,后面的线程只能排队等待

    通过锁机制实现同步机制

  • 异步:同时执行,多个线程同时执行,最终的结果,可能多个线程同时结束,也可能前后结束

  • 并发:多个线程在同一个时间段内交替执行的场景。(异步的一种场景)

  • 并行:多个线程在某一个时间点上同时执行的场景,一般不存在

    一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻可以运行多个线程(同时)

进程

// 引入Process进程
using System.Diagnostics;
namespace_04_Process进程
{
public partial class Form1 :Form
{
public Form1O
{
InitializeComponentO;
}
//获取当前正在运行的进程
private void button1_click(object sender, EventArgs e)
{
Process[] processes = Process.GetProcessesO;
//string str = "";
int count = O;
foreach (Process process in processes)
{
//str+= process.ProcessName + "Nn";
//if (process.ProcessName.Equals C"mspaint")
//{
//process.Kil1O:
//MessageBox.Show("QQ关闭成功");
//}
textBox1.AppendText (process.ProcessName + "IrIn");
if (count % 5 = 0)
{
textBox1.AppendText(Environment.NewLine);
}
count++;
}
//MessageBox.Show(str);
}
//关闭指定进程
private void button2_click(object sender, EventArgs e)
{
string processName = textBox2.Text;
Process[] processes = Process.GetProcesses(;
foreach (Process process in processes)
 {
if (process.ProcessName.Equals(processName))
{
process.Kill();
}
}
}
//打开指定进程
private void button3_click(object sender, EventArgs e)
{
string processName = textBox2.Text;
// StartO
//Process.Start (processName);
//打开记事本,控制面板,画图工具
Process process = new Process ();
//打开进程信息
ProcessStartInfo startInfo = new ProcessStartInfo(processName);
process.StartInfo = startInfo;
process.Start();
}
private void button4_click(object sender, EventArgs e)
{
Process process = new Process O;
//打开进程信息
ProcessStartInfo startInfo = new ProcessStartInfo("c:\IProgram Files\ITencent\IQQNT\IQQ.exe");
process.StartInfo = startInfo;
process.Start();
}
 private void button5_click(object sender, EventArgs e)
{
//打开指定进程中的某个信息
Process.Start("msedge", "http://www.baidu.com");
}

线程

Thread--线程类

namespace 线程
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Thread thread;
        //绑定一个点击事件
        private void button1_Click(object sender, EventArgs e)
        {
            //开启一个新线程--完成一个任务
             thread = new Thread(Print);//高阶函数 都是前台线程
           // thread.IsBackground = true;//设置为后台线程
            thread.Start();
        }
        public void Print()
        {//把一些复杂耗时的任务放到分线程中,在主线程中还可以继续操作
            for (int i = 0; i < 10000; i++)
            {
                textBox1.AppendText( i.ToString() + "\r\n");
            }
        }
        //绑定一个窗体加载事件
        private void Form1_Load(object sender, EventArgs e)
        {//关闭跨线程非法访问
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        //绑定一个关闭事件
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {/*
          在C#当中,通过Thread创建的任何线程级别和主线程是一样的,都是前台线程
           当主线程关闭的时候,并不会阻止分线程的执行,分线程可能会继续执行
           当主窗口关闭的时候,并不会关闭当前的应用程序,必须是所有的前台线程全部结束后才会关闭当前应用程序
            当前台线程关闭时,与之关联的后台线程会全部关闭
          */
​
            //窗体关闭时关闭fen线程
            if (thread!=null)
            {
                thread.Abort();
            }
        }
    }
}
​

线程操作

namespace 线程暂停重启
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
​
        private void button3_Click(object sender, EventArgs e)
        {
            thread.Resume();//恢复线程
        }
​
        private void textBox1_TextChanged(object sender, EventArgs e)
        {//线程状态:运行、未启动、挂起、停止、终止
            /*
             未启动---》运行
             运行---》挂起、停止、终止
             挂起---》运行、关闭
​
             */
            if (thread != null && thread.ThreadState == ThreadState.Unstarted)
            {
                thread.Name = "分线程";
                thread.Start();
            }
            else if( thread.ThreadState == ThreadState.Aborted)
            {
                thread=new Thread(ChangNumber);
                thread.Name = "分线程";
                thread.Start();
            }
        }
        Thread thread;
        private void textBox1_Click(object sender, EventArgs e)
        {
            
            thread = new Thread(ChangNumber);
            thread.Start();
        }
        public void ChangNumber()
        {
            for (int i = 0; i < 100000; i++)
            {
                textBox1.Text = i.ToString();
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            thread.Suspend();//挂起线程
        }
​
        private void button4_Click(object sender, EventArgs e)
        {
            Thread.Sleep(2000);//Thread指当前正在执行的线程
        }
​
        private void Form1_Load(object sender, EventArgs e)
        {
            thread =new Thread(ChangNumber);
            Control.CheckForIllegalCrossThreadCalls = false;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值