C#关键字
c#的静态类与c++一样,不能够实例化,可以直接通过这个类调用内部的public方法和变量,
partial 修饰的类可以分离内部的实现,可以定义在分散的文件中。
sealed修饰的类:类似于最终类,不能够被继承,但是在代码编译阶段可以对代码进行优化。
BlockingCollection<T>数据结构,允许在多个线程中安全读写,主要用于生产者消费者模式。其特点主要如下:1、线程安全;2、有阻塞操作;3、限流;4、同步。主要操作如下:
//添加项目:
Add(T iteam) ; //可以阻塞
TryAdd(T item);//如果队列满了,则失败//获取项目
Take(); //移除并返回一个项目
TryTake(); //集合为空,则失败//属性操作
Count(); //返回当前集合的项数
IsAddingCompleted() ; //获取一个值,指示添加操作。
C#异步线程
在 C# 中,异步线程可以通过 async
和 await
关键字结合任务 (Task
) 来实现,其中async
关键字用于修饰函数名,await
关键字通常表示调用异步方法,同时等待异步方法执行。异步编程能够执行长时间运行的操作(如 I/O 操作、数据库查询、网络请求等)而不会阻塞主线程,特别是用户界面的线程。
using System;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){Console.WriteLine("开始异步操作...");// 调用异步方法await DoWorkAsync();Console.WriteLine("异步操作结束.");}// async 关键字,声明了一个异步方法,模拟一些长时间运行的任务static async Task DoWorkAsync(){Console.WriteLine("异步操作正在进行...");// 模拟耗时操作 (3秒)await Task.Delay(3000); // 让这个任务异步等待3秒Console.WriteLine("异步操作完成.");}
}
同时可以使用Task.Run()的方法来执行异步任务。
public async Task DoHeavyWorkAsync()
{// 将任务委派给后台线程await Task.Run(() =>{// 模拟一个耗时操作for (int i = 0; i < 10; i++){Console.WriteLine("正在工作...");Thread.Sleep(500); // 模拟耗时}});Console.WriteLine("任务完成");
}
当然有时候为了不同间隔时间执行多个异步任务,通常会采用如下的形式进行;
//步骤1:声明相关变量
//声明CancellationTokenSource 用于异步任务的取消以及判断任务是否执行
private CancellationTokenSource cancellationTokenSource;//声明一个队列,让所有异步线程的执行动作加入到队列中
private ConcurrentQueue<Action> actionqueue = new ConcurrentQueue<Action>();//步骤2:点击按钮之后,开始判断任务是否开始
private void button2_Click(object sender, EventArgs e)
{//如果已经有任务在运行,先取消之前的任务if (cancellationTokenSource != null){cancellationTokenSource.Cancel();}// 创建新的 CancellationTokenSourcecancellationTokenSource = new CancellationTokenSource();// 启动三个定时任务StartButtonClickTasks(cancellationTokenSource.Token);
}//步骤3:声明不同异步线程中的任务
private async void StartButtonClickTasks(CancellationToken token)
{// 启动线程1,每隔10ms点击按钮1 Task thread1Task = RunTaskEveryInterval(10, () => button_read_Click(button_read, EventArgs.Empty), token);// 启动线程2,每隔300ms点击按钮2Task thread2Task = RunTaskEveryInterval(300, () => button_write_Click(button_write, EventArgs.Empty), token);//启动线程3,每隔10ms执行一次Task thread3Task = RunTaskEveryInterval(10, Thread_queue_work, token);// 等待三个任务完成await Task.WhenAll(thread1Task, thread2Task, thread3Task);}//步骤4:执行每个任务的Action
private async Task RunTaskEveryInterval(int intervalMs, Action action, CancellationToken token)
{while (!token.IsCancellationRequested){//对于不同的线程执行不一样的动作if(action == Thread_queue_work) {action();}else{actionqueue.Enqueue(action);}await Task.Delay(intervalMs); // 等待指定间隔}
}//步骤5:点击停止按钮之后,停止所有线程
private void stoptest_Click(object sender, EventArgs e)
{cancellationTokenSource?.Cancel();}