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

相关推荐
Front思41 分钟前
AI前端工程师需要具备能力+
前端·人工智能·ai
JAVA社区1 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展
弥树子1 小时前
踩坑记录:服务器内网调用接口,真实请求URL与官方公开URL不一致问题排查
开发语言·php
z落落2 小时前
C# ToCharArray + foreach遍历 + String与StringBuilder
开发语言·c#
学代码的真由酱2 小时前
Java多用户一对一网页聊天室-测试报告
java·开发语言·功能测试·测试
人道领域2 小时前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法
ZC跨境爬虫3 小时前
跟着 MDN 学CSS day_29:(掌握文本与字体样式的核心艺术)
前端·css·ui·html·tensorflow
xiaoshuaishuai83 小时前
C# AvaloniaUI动态显示图片
开发语言·c#
日光明媚3 小时前
一步生成视频!One-Forcing:DMD + 零成本 GAN,训练 200 步超越多步 SOTA
android·开发语言·kotlin
2301_803538953 小时前
Java读取Word图片的两种实用方法
java·开发语言·word