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