C#功能测试

news/2025/2/22 12:53:53/

一、List

内部元素为引用

src[0]的Name为"11",说明修改了引用

List<Source> src = new List<Source>();
src.Add(new Source() { Name = "1", Age = 1, Description = "1" });
src.Add(new Source() { Name = "2", Age = 2, Description = "2" });
foreach (var source in src)
{source.Name = "11";
}
Console.WriteLine(src[0].Name);

内部元素非引用

str[0]=“1”,说明修改的是副本

List<string> str = new List<string>();
str.Add("1");
str.Add("2");
for (int i =0;i >str.Count;i++)
{str[i] = "11";
}
Console.WriteLine(str[0]);

在这里插入图片描述

二、异步

wait()和await

  • 用wait()的话,进入任务后,任务会直接出不来
async void spin()
{while (true){ Task.Delay(1000).Wait();}  
}

在这里插入图片描述

  • 用await的话,进入任务后,会回到调用点
async void spin()
{while (true){ await Task.Delay(1000);}  
}

在这里插入图片描述

SemaphoreSlim

用于替换Lock,使用SemaphoreSlim可以在里面直接用await

SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
await test();
Console.WriteLine("done");async Task test()
{Task task1 = Task.Run(() => CriticalSection("Task 1"));Task task2 = Task.Run(() => CriticalSection("Task 2"));await Task.WhenAll(task1, task2);
}
async Task CriticalSection(string taskName)
{await semaphore.WaitAsync(); // 异步请求进入临界区  try{Console.WriteLine($"{taskName} 进入临界区.");// 模拟异步操作  await Task.Delay(1000);Console.WriteLine($"{taskName} 离开临界区.");}finally{semaphore.Release(); // 确保释放信号量  }
}

await

  • test会堵塞,可能因为这个是最后一个await
  • task1和task2由于semaphore的缘故,不会同时进,并且在Task.run的时候,就已经开始了
  • 在异步函数碰到await的时候,都会返回到调用方,等到await等待的任务体完成,这个异步函数才会往下执行
SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
await test();
Console.WriteLine("done");
async Task test()
{Task task1 = Task.Run(() => CriticalSection("Task 1"));Task task2 = Task.Run(() => CriticalSection("Task 2"));await Task.Delay(1000);var s = Stopwatch.StartNew();await Task.WhenAll(task1, task2);Console.WriteLine("when all done:" + s.ElapsedMilliseconds);
}
async Task CriticalSection(string taskName)
{await semaphore.WaitAsync();try{Console.WriteLine($"{taskName} 进入临界区.");await Task.Delay(2000);Console.WriteLine($"{taskName} 离开临界区.");}finally{semaphore.Release(); // 确保释放信号量  }
}

在这里插入图片描述

  • 把test()前的await去掉后,就不会堵塞,会直接执行done,然后到task1-2都完成了之后,输出when all done:3011,说明在异步函数碰到await的时候,都会返回到调用方(test),然后到输出done,等到await等待的任务体(WhenAll)完成,这个异步函数才会往下执行,输出when all done:3011
    在这里插入图片描述
  • 加上延时开始和延时结束日志,可以看出,开始在执行await Task.Delay(1000)后,就已经返回到调用方test了,输出done。等待1000ms延时结束后,再在test异步方法体里面往下执行,输出延时结束
    在这里插入图片描述

取消和超时取消

如果取消了,token.IsCancellationRequested会为真

// 创建 CancellationTokenSource  
var cts = new CancellationTokenSource();
// 设置超时时间为 5 秒  
cts.CancelAfter(TimeSpan.FromSeconds(5));
// 启动一个可以被取消的任务  
var task = Task.Run(() => DoWork(cts.Token), cts.Token);try
{await task;
}
catch (OperationCanceledException)
{Console.WriteLine("任务被取消(超时)。");
}static void DoWork(CancellationToken token)
{for (int i = 0; i < 10; i++){// 检查是否请求了取消  if (token.IsCancellationRequested){Console.WriteLine("请求取消,退出工作...");return;}Console.WriteLine($"工作中... {i}");Thread.Sleep(1000); // 模拟工作  }
}

http://www.ppmy.cn/news/1574160.html

相关文章

一篇文章理解常用的前端设计模式

前端设计模式 一.设计模式概览 设计模式是针对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff0c;而不是现成的代码&#xff0c;每种设计模式都有每种语言中的具体实现方式。学习设计模式更多是理解各个模式的内在思想和解决…

深入了解 mica-auto:自动生成 Java SPI 和 Spring Boot 配置的利器

1. mica-auto 出现的背景 在 Java 开发中,尤其是在构建 Spring Boot 项目和使用 Java SPI(Service Provider Interface)机制时,开发者常常面临配置文件编写的繁琐问题。 1.1 Java SPI 的配置痛点 Java SPI 是一种服务发现机制,允许第三方为程序提供扩展实现。使用 SPI …

基于LangGraph和Ollama实现可调用AI搜索引擎Tavily的Agentic RAG问答机器人

这篇博客将和大家分享如何快速实现一个运行逻辑相较于传统链式RAG&#xff08;用户询问 -> 检索相关信息作为上下文 -> LLM推理回复&#xff09;更为智能、适应性更强的Agentic RAG Chatbot&#xff08;实现思路参考 Langgraph Agentic RAG 实现官方文档教程&#xff09;…

UE_C++ —— Container TSet

目录 一&#xff0c;TSet 二&#xff0c;Creating and Filling a Set Editing UPROPERTY TSets 三&#xff0c;Iteration 四&#xff0c;Queries 五&#xff0c;Removal 六&#xff0c;Sorting 七&#xff0c;Operators 八&#xff0c;Slack 九&#xff0c;DefaultKe…

游戏引擎学习第116天

回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化&#xff0c;尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库&#xff0c;而是深入理解代码并进行优化。当前阶段正进行SIMD&#xff08;单指令多数据&#xff09;优化&#xff0c;使用Intel推荐…

Innovus中快速获取timing path逻辑深度的golden脚本

在实际项目中我们经常会遇到一条timing path级数特别多&#xff0c;可能是一两页都翻不完。此时&#xff0c;我们大都需要手工去数这条path上到底有哪些是设计本身的逻辑&#xff0c;哪些是PR工具插入的buffer和inverter。 数字IC后端手把手培训教程 | Clock Gating相关clock …

HTTP SSE 实现

参考&#xff1a; SSE协议 SSE技术详解&#xff1a;使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为&#xff1a;服务端和客户端建立连接之后双方均保持连接&#xff0c;但仅支持服务端向客户端推送数据。推送完毕之后关闭连接&#xff0c;无状态行。 下面是基于…

ubuntu docker 安装 deepseek anythingllm/openwebui教程

全新服务器安装起始&#xff1a; 1. 安装ubuntu到服务器中 2. 安装docker 安装教程 ubuntu 安装 docker详细教程_ubuntu安装教程docker-CSDN博客 3. 安装 ollama docker pull ollama/ollama 3.1 创建 存储目录 &#xff08;示例放在/home/ollama中&#xff09; cd /home/ …