Maxon's Blog

C# .Net多线程相关的一些补充

2

.NET 6新特性

  • namespace不需要用大括号包围,可以直接 namespace name;

  • switch 新用法

    C#
    int num=0;
    string res = num switch{
            1=>"现在是1",
            2=>"现在是2",
            3=>"现在是3",
            _=>"default"
    };
    

一些小贴士

1.方法中参数修饰符 out ref params

C#
// out 参数由被调用的方法赋值,按引用传递
...Func...
Add(1,2,out int res);
Console.Write(res)//此时res已被赋值
...Func...
void Add(int num1,int num2,out int res){
    res=num1+num2;//若此时不给res赋值则报错
}

//ref  调用者赋值,且可由被调用的方法 *可选* 重新赋值
...Func...
int res=0;//此时必须赋值
Sub(1,2,ref res);
Console.Write(res)//此时res已被赋值
...Func...
void Sub(int num1,int num2,ref int res){
    res=num1-num2;//可以不给res赋值
}

//params 允许将一组可变的数量的参数作为单独的逻辑参数进行传递,只能有一个 params 且必须为参数列表最后一个参数
...Func...
Add(1,2);//参数列表
...Func...
void Add(params int[] nums){
    int res=nums[0]+nums[1];
}

  • out修饰的参数必须在方法内修改,而ref以修改也可以不修改
  • out在传参时,参数是局部变量的话,可以不用赋值,因为out一定会对其进行赋值;
  • ref修饰的参数,在实参必须有初始值才能调用,因为ref修饰的不一定会给它赋值

2.属性

属性=字段+方法(代理模式)

属性遵循大驼峰命名

C#
public int Age {get;set;}

3.扩展方法

扩展方法必须在静态类下声明

参数前加this 如 AddJuhao(this string str) 调用 其他类对象.AddJuhao()

多线程

线程创建

C#
new Thread(new ThreadStart(FuncName));//方式1
new Thread(FuncName); //方式2
new Thread(new ParameterizedThredStart(FuncName));//方式3  //可带参数    obj.Start("参数");
thread.Start()//启动线程 
    
thread.Abort()//线程终止   
thread.Abort("Thread Abort")// 参数为ExceptionState  供捕获异常使用

加解锁 、互斥量、信号量、原子操作

  • 信号量:可以指定数量的线程同时使用
  • 互斥量:只能被一个线程使用
  • 原子操作
C#
lock(obj){
    ...
}
//相当于
{
    Monitor.Enter(obj);
    ...
    Monitor.Exit(obj);
}

//Mutex 互斥量   
private static Mutex mutex =new Mutex();//定义
mutex.waitOne();//等待互斥量授权  也就是等待其他线程 解锁
mutex.ReleaseMutex();//当前线程解锁

//信号量  
Semaphore semaphore=new Semaphore(initialCount: 0, maximumCount: 2);//2个位置 初始0
semaphore.Release(releaseCount:2);//释放信号量2个位置
semaphore.waitOne();//信号量申请权限   最多可以有2个线程来使用

//Interlocked  原子操作类
Interlocked.ADD(变量,100);//变量 +100

//AutoResetEvent

volatile 可见性

volatile - C# 参考 | Microsoft Learn

C# Volatile__iorilan的博客-CSDN博客

即在多线程中的每次写操作,内存值被更新;读操作,内存值和当前引用的缓存值一致。

Concurrent命名空间

提供线程安全集合类

async await

C#
async ...{//异步
    await ...{ //等待
        ...
    }
}

任务列表List<Task>

C#
private async void Button_Click_1(object sender, RoutedEventArgs e)
        {
            List<Task> ts=new List<Task>();
            ts.Add(Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("素菜做好了", "友情提示");

            }));
            ts.Add(Task.Run(() =>
            {
                Thread.Sleep(1000);
                MessageBox.Show("荤菜做好了", "友情提示");
            }));


/*          //当任务列表所有任务完成之后  
            Task.WhenAll(ts).ContinueWith(t =>
            {
                MessageBox.Show("开始吃饭!", "提示");
            });*/

            //或者使用以下方式
            await Task.WhenAll(ts);
            MessageBox.Show("开始吃饭!", "提示");
        }