向线程池中的新线程传递两个参数有时可能很复杂,但是使用 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变量。
这样做有什么问题吗?
另一种选择是创建一个实现了具有三个成员 (test、s1 和 s2) 的不可变类型的新类。但在这一点上,这似乎只是额外的工作而没有好处。
o => test.DoWork(s1, s2)
,而不是更冗长的定义呢? - Mehrdad Afshari