7.带输入参数的线程启动 C# + WPF 完整示例

cs 复制代码
public class TestParams
{
    public int Delay { get; set; }
    public double Freq { get; set; }
    public int Channel { get; set; }
}

private void Button_Click_Start(object sender, RoutedEventArgs e)
{
    var paramList = new[]
    {
        new TestParams { Delay = 100, Freq = 1000, Channel = 1 },
        new TestParams { Delay = 200, Freq = 2000, Channel = 2 },
        new TestParams { Delay = 300, Freq = 3000, Channel = 3 },
        new TestParams { Delay = 400, Freq = 4000, Channel = 4 }
    };
    
    foreach (var p in paramList)
    {
        var localParam = p;  // 局部副本
        Thread t = new Thread(() => RunTest(localParam))
        {
            IsBackground = true
        };
        t.Start();
    }
}

private void RunTest(TestParams p)
{
    Thread.Sleep(p.Delay);
    Console.WriteLine($"通道 {p.Channel}: 完成");
}

这段代码展示了多线程参数传递 的一种封装方式,核心解决闭包陷阱多参数传递问题。

1. 参数封装类

cs 复制代码
public class TestParams
{
    public int Delay { get; set; }      // 延时时间 (ms)
    public double Freq { get; set; }    // 频率值 (Hz)
    public int Channel { get; set; }    // 通道编号
}

作用 :将多个相关参数打包成一个对象,避免线程启动时的 object 装箱拆箱。


2. 参数数组初始化

cs 复制代码
var paramList = new[]
{
    new TestParams { Delay = 100, Freq = 1000, Channel = 1 },
    new TestParams { Delay = 200, Freq = 2000, Channel = 2 },
    new TestParams { Delay = 300, Freq = 3000, Channel = 3 },
    new TestParams { Delay = 400, Freq = 4000, Channel = 4 }
};

3. 局部副本

复制代码
foreach (var p in paramList)
{
    var localParam = p;  // ← 关键行!
    Thread t = new Thread(() => RunTest(localParam));
    ...
}

原理foreach 的迭代变量 p同一变量 反复赋值,Lambda 捕获的是变量引用 而非值。局部副本 localParam 每次循环都是新变量

相关推荐
溪语流沙7 小时前
【Python项目实战】部署上线:把博客发布到云服务器
服务器·开发语言·python
岁岁种桃花儿7 小时前
Vue组件第六篇:Vue单文件组件
开发语言·前端·javascript·vue.js
yivifu7 小时前
创建支持交叉链接且鼠标悬停显示注释框的HTML文件
前端·javascript·html
朽棘不雕7 小时前
Qt项目代码解释
开发语言·qt
计算机毕设定制辅导-无忧学长7 小时前
《基于Java的旧物回收管理系统设计与实现》
java·开发语言
“AI国潮设计-小江”7 小时前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁美食猫IP & 创意甜品设计(附ComfyUI工作流与商用授权思路)
开发语言·人工智能·python·prompt·aigc
sdm0704277 小时前
仿muduo库实现高并发服务器-下
开发语言·网络·c++·多路转接
GreenTea8 小时前
🔥别再用压缩了,Codex、NVIDIA、DeepSeek、Uber 给出 Agent 上下文管理的新答案
前端·后端·算法
公子小六8 小时前
基于.NET的Windows窗体编程之WinForms自定义控件(1)
windows·.net
爱奥尼欧8 小时前
【Git】远程分支删了本地还在、两个分支历史不相干?两招故障排解
开发语言·git