为什么我会超出范围?

时间:2015-07-13 04:12:11

标签: c# .net winforms

我在DoWork的{​​{1}}事件中包含此代码:

backgroundworker

在线:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        WaitHandle[] waitHandleList = null;
        List<ManualResetEvent> mre = new List<ManualResetEvent>();

        for (int i = 0; i < GetProcessesIntptrList().Count; i++)
        {
            ProcessInfo info;
            info = GetProcessInfo(GetProcessesIntptrList()[i]);
            if (procList.Count == GetProcessesIntptrList().Count)
                break;
        }

        for (int i = 0; i < procList.Count; i++)
        {
            if (i == 9)
            {
                break;
            }
            else
            {
                SafeWaitHandle swh1 = new SafeWaitHandle(procList[i].Handle, false);

                mre[i]    = new ManualResetEvent(true);
                mre[i].SafeWaitHandle = swh1;
                waitHandleList = new WaitHandle[] { mre[i] };
                worker.ReportProgress(0, "Running");
            }
        }

        while (true)
        {
                    if (procList != null)
                    {
                        for (int i = 0; i < procList.Count; i++)
                        {
                            WaitHandle.WaitAll(waitHandleList);
                            if (procList[i].HasExited)
                            {
                                worker.ReportProgress(0, "Exited");
                                procList[i] = null;
                            }
                        }
                    }
                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                }
                else
                {

                }
            }

    }

mre[i] = new ManualResetEvent(true); 中出现System.ArgumentOutOfRangeException类型的例外但未在用户代码中处理

mscorlib.dll

当异常发生时,mre为空,计数为0,I也为0 问题是如何创建9个mre实例?

2 个答案:

答案 0 :(得分:2)

如果没有明确说明问题的a good, minimal, complete code example,即使不是不可能知道最佳解决方案是什么也很困难。但是,您可能需要做的就是更改分配:

mre[i]    = new ManualResetEvent(true);

到此:

mre.Add(new ManualResetEvent(true));

答案 1 :(得分:0)

您正在使用对象mre作为ManualResetEvent的列表,该列表没有固定的大小和项目的位置。 所以带有列表的代码mre [i]没有达到索引'i'是不允许的,并且会抛出一个IndexOutOfRangeExeption 所以你必须使用add方法添加元素,然后你可以通过索引访问该元素。 袋子与孔托盘不同。