【发布时间】:2018-01-09 02:22:48
【问题描述】:
我知道在 C# .Net 中创建线程的两种方法,您可以使用ThreadStart 委托,同时定义 lambda 表达式也可以完成这项工作。
假设我有一个类定义为:
class myWorkerClass{
public myWorkerClass(string configInfo) {
}
public void DoWork(ConcurrentQueue<string> executionBuffer) {
}
public void DoWork2() {
}
}
我将在main函数中构造myWorkerClass,并为每个myWorkerClass对象构造线程来运行DoWork方法:
class Program {
static void Main(string args[]) {
int nodeCount = 0;
using (var reader = XmlReader.Create("config.xml"))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element &&
reader.Name == "worker")
{
nodeCount++;
}
}
}
myWorkerClass[] obj = new myWorkerClass[nodeCount];
XmlDocument doc = new XmlDocument();
doc.Load("config.xml");
int call = 0;
foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
// Code to parse xml and get configInfo
obj[call] = new myWorkerClass(configInfo);
call++;
}
ConcurrentQueue<string> bufferExecutions = new ConcurrentQueue<string>();
for (int i = 0; i < call; ++i)
{
//Thread workThread = new Thread(new ThreadStart(obj[i].DoWork2));
Thread workThread = new Thread(() => obj[i].DoWork(bufferExecutions));
workThread.IsBackground = true;
workThread.Start();
}
}
}
我的问题是创建线程的 lambda 表达式方式给了我Index was outside the bounds of the array. 的错误,但是当我使用ThreadStart 委托创建新线程时,我的代码工作正常。我想知道导致我的问题的这两种机制有什么不同?
【问题讨论】:
-
Lambda 捕获变量而不是值。
-
@PetSerAI,非常感谢!很棒的评论。解释了一切
标签: c# .net multithreading lambda