for
循环中使用 Task
并且要把 for
循环的变量传递给 Task
时,需要特别注意变量捕获的问题。因为如果不恰当处理,可能会出现所有 Task
都使用循环结束时变量的最终值这种情况。下面为你介绍几种正确的处理方式。Task
就能捕获到正确的值。示例代码如下:using System; using System.Threading.Tasks; class Program { static async Task Main() { // 定义循环次数 int loopCount = 5; // 用于存储所有任务的数组 Task[] tasks = new Task[loopCount]; for (int i = 0; i < loopCount; i++) { // 创建临时变量,捕获当前循环的 i 值 int temp = i; // 创建一个任务,打印临时变量的值 tasks[i] = Task.Run(() => { Console.WriteLine($"Task 执行,传入的值为: {temp}"); }); } // 等待所有任务完成 await Task.WhenAll(tasks); } }
for
循环里,每次迭代都创建一个临时变量 temp
并把当前的 i
值赋给它。Task.Run
中使用这个临时变量,这样每个 Task
捕获的就是当时 temp
的值。Task.WhenAll
等待所有任务完成。
using System; using System.Threading.Tasks; class Program { static async Task Main() { int loopCount = 5; Task[] tasks = new Task[loopCount]; for (int i = 0; i < loopCount; i++) { // 定义一个匿名方法,接收一个整数参数 Action<int> action = (index) => { Console.WriteLine($"Task 执行,传入的值为: {index}"); }; // 以任务的形式运行该匿名方法,并传入当前的 i 值 tasks[i] = Task.Run(() => action(i)); } await Task.WhenAll(tasks); } }
Action<int>
委托 action
,它接收一个整数参数。Task.Run
中调用这个委托并传入当前的 i
值,这样每个 Task
就能正确处理传入的值。Task.WhenAll
等待所有任务完成。Task.Run
中的 Lambda 表达式Task.Run
中的 Lambda 表达式,可直接在 Lambda 里使用该变量。以下是示例代码:using System; using System.Threading.Tasks; class Program { static async Task Main() { // 定义一个变量 string message = "Hello, Task!"; // 直接在 Task.Run 中使用 Lambda 表达式并使用变量 Task task = Task.Run(() => { Console.WriteLine(message); }); // 等待任务完成 await task; } }
这个也算最简单的了。只为只考虑三位数。
-- 钟铧若岩这个oracle的内部机制,不清楚啊。
-- 钟铧若岩
Copyright © 2025 钟铧若岩
Powered by .NET 9.0 on Kubernetes
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?