C#高级语法之线程与任务

一、线程

新建线程

同步代码: 代码执行顺序从上到下执行,如果执行的时间过长(大量计算、文件读写操作、通信),会阻塞UI界面

异步代码:先去执行同步代码,再去执行异步代码,执行顺序不再是从上到下。

实现异步代码方式: 多线程编程(Thread)、异步任务(Task)、 后台任务 (BackgroundWorker)

1 创建异步任务的方式

cs 复制代码
ThreadStart ts = new ThreadStart(f1); //参数传递一个线程方法
Thread th1 = new Thread(ts);
th1.Start();

2 方式2 直接在Thread函数传递线程方法

cs 复制代码
  Thread th = new Thread(f2);
  th.IsBackground = true; //是否为后台线程,如果为false不是后台线程,如果true是后台线程
  //关闭窗口的时候 需要把分线程关闭,设置为线程为后台线程
  //关闭窗口的时候 需要把分线程关闭 如果设置为线程为前台线程 需要窗口关闭的时候销毁线程 FormCloising(){th.Abort()}
th.Start();

3 方法3 可以通过start(参数)。向分线程传递数据

cs 复制代码
 new Thread(a =>
{
    Console.WriteLine("通过lambda表达式直接定义线程函数" + a);
}).Start(10);

4方法4使用线程池创建线程

cs 复制代码
线程池是一种 多线程管理技术,用于 复用已创建的线程,避免频繁创建和销毁线程带来的性能开销。它通过预先创建一组线程,并维护一个任务队列,按需分配任务给空闲线程执行。
ThreadPool.QueueUserWorkItem(a =>
{
    Console.WriteLine("使用线程池创建重复使用线程对象" + a);
}, 10);

解决跨线程访问ui的问题

cs 复制代码
this.Invoke(new Action(() =>
{
    this.BackColor = Color.Red;
    this.Text = "Hello world";
}));

第二种方法

cs 复制代码
// 第二种解决跨线程访问ui的问题 ,调试时候可以使用,发布项目不要使用
Control.CheckForIllegalCrossThreadCalls = false; // 是否检查跨线程访问  =false 不检查
this.BackColor = Color.Red;
this.Text = "Hello world";

二、任务

1 创建任务的方式

cs 复制代码
Task t1 = new Task(f1);
t1.Start();

2 创建任务2

cs 复制代码
 Task.Run(() =>
 {
     Console.WriteLine("222222");
 });

3 创建异步任务

cs 复制代码
TaskFactory fac = new TaskFactory();
fac.StartNew(() =>
{
    Console.WriteLine("333333");
});

处理异步任务按照顺序执行,方法1:

cs 复制代码
多层嵌套回调,地狱回调
Task.Run(() =>
{
    Console.WriteLine("11111");
    Task.Run(() =>
    {
        ;
        Console.WriteLine("222");
        Task.Run(() =>
        {
            Console.WriteLine("333");
        });
    });
});

方法2:

// 使用async 和 await解决多层回调

cs 复制代码
//async 异步
//await 等待,后面跟一个异步任务,等待异步执行完之后 再往下执行,把异步任务写成同步代码
await Task.Run(f3);
await Task.Run(f4);
await Task.Run(f5);
cs 复制代码
 public void f3()
 {

     Console.WriteLine("333");

 }
 public void f4()
 {

     Console.WriteLine("4444");

 }
 public void f5()
 {

     Console.WriteLine("5555");

 }
相关推荐
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲11 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
曹牧12 小时前
C#:输入的字符串格式不正确
c#
程序喵大人13 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)13 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的14 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质14 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
释厄62315 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_9628857215 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python