我希望使用线程池来在更短时间内完成长时间运行的任务。我的方法当然可以处理更多的作业,但我准备了一个简单的示例以便您理解我的情况。如果我运行这个应用程序,它会在注释掉的行上抛出ArgumentOutOfRangeException异常。同时它显示i等于10。如果它是10,怎么可能进入for循环呢?
如果我不运行应用程序并调试这段代码,它就不会抛出异常,而且运行良好。
这里的问题是什么?
如果我不运行应用程序并调试这段代码,它就不会抛出异常,而且运行良好。
public void Test()
{
List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
for (int i = 0; i < 10; i++) list1.Add(i);
for (int i = 0; i < 10; i++) list2.Add(i);
int toProcess = list1.Count;
using (ManualResetEvent resetEvent = new ManualResetEvent(false))
{
for (int i = 0; i < list1.Count; i++)
{
ThreadPool.QueueUserWorkItem(
new WaitCallback(delegate(object state)
{
// ArgumentOutOfRangeException with i=10
Sum(list1[i], list2[i]);
if (Interlocked.Decrement(ref toProcess) == 0)
resetEvent.Set();
}), null);
}
resetEvent.WaitOne();
}
MessageBox.Show("Done");
}
private void Sum(int p, int p2)
{
int sum = p + p2;
}
这里的问题是什么?
i
。 - leppie