c#基础1

时间:2024-10-17 08:23:08

C#关键字

c#的静态类与c++一样,不能够实例化,可以直接通过这个类调用内部的public方法和变量,

partial 修饰的类可以分离内部的实现,可以定义在分散的文件中。

sealed修饰的类:类似于最终类,不能够被继承,但是在代码编译阶段可以对代码进行优化。

BlockingCollection<T>数据结构,允许在多个线程中安全读写,主要用于生产者消费者模式。其特点主要如下:1、线程安全;2、有阻塞操作;3、限流;4、同步。主要操作如下:

//添加项目:
Add(T iteam) ;  //可以阻塞
TryAdd(T item);//如果队列满了,则失败

//获取项目
Take();        //移除并返回一个项目
TryTake();    //集合为空,则失败

//属性操作
Count();      //返回当前集合的项数
IsAddingCompleted() ;    //获取一个值,指示添加操作。

C#异步线程

        在 C# 中,异步线程可以通过 asyncawait 关键字结合任务 (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();

}