gpt4 book ai didi

c# - 带有 lambda 表达式和匿名方法的 ThreadPool.QueueUserWorkItem

转载 作者:IT王子 更新时间:2023-10-29 04:19:25 26 4
gpt4 key购买 nike

将两个参数传递给线程池上的新线程有时会很复杂,但似乎使用 lambda 表达式和匿名方法,我可以做到这一点:

public class TestClass
{
public void DoWork(string s1, string s2)
{
Console.WriteLine(s1);
Console.WriteLine(s2);
}
}

try
{
TestClass test = new TestClass();
string s1 = "Hello";
string s2 = "World";
ThreadPool.QueueUserWorkItem(
o => test.DoWork(s1, s2)
);
}
catch (Exception ex)
{
//exception logic
}

现在,我当然已经简化了这个例子,但以下几点是关键:

  • 传递的字符串对象是不可变的,因此是线程安全的
  • s1 和 s2 变量在 try block 的范围内声明,我在将工作排队到线程池后立即退出,因此 s1 和 s2 变量在那之后永远不会被修改。

这有什么问题吗?

另一种方法是创建一个新类,该类实现具有 3 个成员的不可变类型:test、s1 和 s2。在这一点上,这似乎是没有任何好处的额外工作。

最佳答案

这没有错。编译器本质上是自动执行您描述的替代方法。它创建一个类来保存捕获的变量(test、s1 和 s2),并将委托(delegate)实例传递给 lambda,lambda 转化为匿名类的方法。换句话说,如果您继续使用您的替代方案,您最终会得到与编译器刚刚为您生成的非常相似的东西。

关于c# - 带有 lambda 表达式和匿名方法的 ThreadPool.QueueUserWorkItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/738139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com