c#异步--async和await的使用

c#异步--async和await的使用

async/await是C#5.0中推出的

async用来修饰方法,表明这个方法是异步的,声明的方法的返回类型必须为:void,Task或Task<TResult>。

Task<TResult>就是有返回值的Task,TResult就是返回值类型。比如Task<int>

await必须用来修饰Task或Task<TResult>,而且只能出现在已经用async关键字修饰的异步方法中。

通常情况下,async/await成对出现才有意义,

await可以让主线程等待后台线程执行完毕

await不会阻塞主线程

下面用例子来说明

 

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("1:" +Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("Main方法执行开始");
            Run();
            Console.WriteLine("Main方法执行结束");
            Console.Read();
        }

        static async void Run()
        {
            Console.WriteLine("2:" +Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("Run方法执行开始");
            await Task.Run(()=> {
               Console.WriteLine("Task.Run方法执行开始");
               Console.WriteLine("3:" +Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10000);
               Console.WriteLine("Task.Run方法执行结束");
            });

            Console.WriteLine("4:" +Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("Run方法执行结束");
        }
    }

常见错误

1 异步方法的返回类型必须为void、Task 或 Task<T>

2 如果一个async修饰的方法没有Task.run则会保下面警告

警告CS1998  此异步方法缺少 "await" 运算符,将以同步方式运行。请考虑使用"await"运算符等待非阻止的API 调用,或者使用"await Task.Run(...)" 在后台线程上执行占用大量CPU 的工作

总结

1 async方法必须有Task.Run异步方法

2 async方法里面通常由await关键字 它用在Task.run前面 作用是告诉主线程 我这边不用你管了 你继续执行你自己的。在await之前还是属于主线程的。还是同步的。

3 await代码之前是主线程await之后包括Task.Run以及它后面的代码 都是另外一个线程。

### Secure CTR 模式的加密与安全计数器 CTR(Counter)模式是一种常见的分组密码操作模式,其特点是将一个分组密码转换成流密码。这种模式具有并行化处理的优点,并且能够抵抗某些类型的攻击。 #### 安全性增强措施 为了提高CTR模式的安全性,通常会采取一些额外的保护机制: - **唯一性随机性**:确保每次使用的初始向量(IV, Initial Vector)都是唯一的不可预测的。这可以通过引入时间戳或其他高熵源来实现[^1]。 - **认证标签**:结合消息认证码(MAC)或带关联数据的认证加密(AEAD),以防止篡改重放攻击。这种方法不仅提供保密性还提供了完整性验证功能[^2]。 #### 实现方法 以下是Python中使用PyCryptodome库的一个简单例子展示如何正确地设置应用Secure CTR模式: ```python from Crypto.Cipher import AES import os def generate_secure_ctr_cipher(key): iv = os.urandom(16) # Generate a random IV of appropriate length (for AES this is typically 16 bytes) cipher = AES.new(key, AES.MODE_CTR, initial_value=iv) return cipher, iv key = b'Sixteen byte key' # Example Key; should be securely generated and managed in practice. cipher, iv = generate_secure_ctr_cipher(key) plaintext = b'The quick brown fox jumps over the lazy dog' ciphertext = cipher.encrypt(plaintext) print(f"Ciphertext: {ciphertext.hex()}") ``` 此代码片段展示了创建一个新的AES对象用于CTR模式的操作方式,其中`initial_value`参数指定了要作为计数器起点的值。这里选择了操作系统提供的强伪随机函数生成了一个新的初始化向量。 #### 额外注意事项 当部署CTR模式时还需要注意以下几点: - 不同的消息应当采用不同的IV; - 如果可能的话,应该优先考虑支持AEAD的标准协议如TLS 1.3中的ChaCha20-Poly1305组合; - 对于长期存储的数据,建议定期更换密钥以及相应的IV。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值