2015-07-13 160 views
0

我有一个DoWork事件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但在用户代码中没有处理

Additional information: Index was out of range. Must be non-negative and less than the size of the collection. 

当发生异常时mre为空count 0和I is als 0 0 问题是如何创建9个mre的实例?

+1

当您第一次尝试访问它时,它是空的。 – deathismyfriend

+0

如果我是0,那么它将尝试访问mre中的第一个元素...如果它为空,则不存在。所以它超出范围。 – User92

回答

2

没有a good, minimal, complete code example明确说明了这个问题,即使不是不可能知道什么是最好的解决方案,也是很困难的。然而,很可能是所有你需要做的是改变从这个分配:

mre[i] = new ManualResetEvent(true); 

这样:

mre.Add(new ManualResetEvent(true)); 
+0

@ManuelSpechia这是一个不同的问题;你可能想要发布它。 – phoog

0

您使用对象MRE作为ManualResetEvent的名单,其中没有一个固定的大小与物品的位置。 因此,带有列表的代码mre [i]没有被允许并且会抛出IndexOutOfRangeExeption 因此,您必须使用add方法添加元素,然后才能通过索引访问该元素。 一个袋子不同于孔洞托盘。

相关问题