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

相关推荐
大圣编程18 小时前
Java 多维数组详解
java·开发语言
DianSan_ERP20 小时前
电商架构演进:如何在高并发场景下实现多平台API的标准化履约?
运维·前端·网络·安全·架构·自动化
殳翰20 小时前
下服务器端开发流程及相关工具介绍(C++)
开发语言·c++
落寞的星星21 小时前
这个对象就包含了已经转换好的DFA和各种词法分析器运转所需要的参数。下一步,我们就可以用ScannerInfo对象创建出Scanner对象,请看下面的代码:
开发语言·c#
nothing&nowhere21 小时前
用 Python 做问卷数据清洗:无效样本检测与处理实战
开发语言·python·数据清洗·数据处理·问卷星·问卷星脚本·刷问卷
2601_961593421 天前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
HZZD_HZZD1 天前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
碎_浪1 天前
给键盘党的英语记忆工具:我做了一款「打字背单词」桌面应用
前端·程序员·ai编程
阿成学长_Cain1 天前
Linux dirs命令详解|Bash目录堆栈管理快速切换目录实战教程
linux·运维·前端·数据库
多加点辣也没关系1 天前
JavaScript|第4章:类型转换
开发语言·javascript