将两个参数传递给线程池上的新线程有时会很复杂,但似乎使用 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 块的范围内声明,我在将工作排队到线程池后立即退出,因此 s1 和 s2 变量在此之后永远不会修改。
这有什么问题吗?
另一种方法是创建一个新类,该类实现具有 3 个成员的不可变类型:test、s1 和 s2。在这一点上,这似乎是额外的工作,没有任何好处。