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

标签 c# multithreading lambda anonymous-methods threadpool

将两个参数传递给线程池上的新线程有时会很复杂,但似乎使用 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/

相关文章:

java - 如何从java中的另一个正在运行的线程访问方法

java - java中的循环任务

multithreading - chalice "Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)"

c# - 关于 lambda 表达式的困惑 C#

c# - 我可以编写递归 lambda 表达式来获取所有相关数据的最佳方式是什么?

java - 抽象类作为功能接口(interface)

c# - 实体 DBContext 到 LinQ

javascript - 使用 C# 和 Javascript 隐藏/显示 html 表格

c# - 保存从模板生成的 OpenXML 文档 (Word)

javascript - 带有 ajax slider 扩展控件的 asp.net 控件 2 文本框