C# 线程(二)——匿名函数给线程Thread传递参数

本文探讨了如何使用Lambda表达式为Thread传递参数,包括直接传递和通过临时变量避免参数共享引起的错误。示例展示了多线程环境下变量作用域的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里主要讨论用Lambda表达式给Thread传递参数。
我们除了用ParameterizedThreadStart委托传递参数,还可以用lambda表达式为Thread传递参数,如下例子所示:

static void Main()
{
  Thread t = new Thread ( () => Print ("Hello from t!") );
  t.Start();
}
 
static void Print (string message) 
{
  Console.WriteLine (message);
}

这里使用了匿名函数:

void ()
{
   Print("Hello from t!");
}

用Lambda表达式传递参数时需要注意参数的传递是否可能遭破坏,比如:

for (int i = 0; i < 10; i++)
  new Thread (() => Console.Write (i)).Start();

它运行的结果,很有可能是这样的(并不如我们想象的):

0223557799

这部分原因是多线程共享使用了变量i。如果代码改为下面这样,那么就解决了这个问题:

for (int i = 0; i < 10; i++)
{
  int temp = i;
  new Thread (() => Console.Write (temp)).Start();
}

这个时候变量i的值给另一个临时内存temp,每一次执行新的线程开辟的是一个新的temp,因此结果如我们所愿。
如这个例子所示,我们也很容易写出下面这个很容易犯错的例子:

string text = "t1";
Thread t1 = new Thread ( () => Console.WriteLine (text) );
 
text = "t2";
Thread t2 = new Thread ( () => Console.WriteLine (text) );
 
t1.Start();
t2.Start();

程序的结果可能也并不如我们所愿,它的结果很可能如下:

t2
t2

导致这样的结果的原因是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮君

写作不易,多谢赏赐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值