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

相关推荐
Wang's Blog5 小时前
Go-Zero 项目开发43:基于 Filebeat 收集各个服务的日志信息
开发语言·golang·go-zero·filebeat
丈剑走天涯6 小时前
JDK 17 正式特性
java·开发语言
东方小月6 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端
秋田君6 小时前
QT_QFontDialog类字体对话框
开发语言·qt
圣光SG6 小时前
Java操作题练习(七)
java·开发语言·算法
Csvn6 小时前
🧩 ESM vs CJS 混用的 7 个「天坑」——从 TypeScript 编译到 Node 与浏览器
前端
Csvn7 小时前
🎯 Web 性能 API 集合:Performance Observer 的 5 个冷门妙用
前端
Csvn7 小时前
深入 React 闭包陷阱:从根源上理解并根治 stale closure
前端
whyfail7 小时前
前端学 Spring Boot(8):接口为什么越用越慢?
前端·spring boot·后端
麻瓜老宋7 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十三步,多行输入、进制输出、错误恢复、常量折叠、配置加载等
c语言·开发语言·atomcode