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();
}
// 创建新的 CancellationTokenSource
cancellationTokenSource = 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点击按钮2
Task 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();
}