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 每次循环都是新变量

相关推荐
CodeSheep2 小时前
同事偷偷给我介绍私活,说1万报酬全给我,结果甲方私下告诉我说,同事在当中白拿了2万,我觉得被耍了,媳妇却让我要知足,说我一点不亏
前端·后端·程序员
爱学习的小可爱卢2 小时前
算法—Java Map 核心方法与实战场景指南
java·开发语言·算法
Betelgeuse762 小时前
告别传统 ModelForm:用 React 与 DRF 打造现代化项目管理表单
前端·react.js·django·前端框架
豆豆2 小时前
建站系统怎么选?2026年SaaS平台与开源CMS对比分析
java·开发语言·开源·cms·网站建设·网站制作·网站开发
神仙别闹2 小时前
基于C++实现的简单的SMTP服务器
服务器·开发语言·c++
IT_陈寒2 小时前
SpringBoot这个"自动配置"差点让我加班到凌晨
前端·人工智能·后端
恋恋风尘hhh2 小时前
文字点选验证码前端安全研究:以网易易盾(dun.163)为例
前端·安全
鹏程十八少2 小时前
1.2026金三银四 Android Glide 23连问终极拆解:生命周期、三级缓存、Bitmap复用,大厂面试官到底想听什么?
android·前端·面试