我在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实例?
答案 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方法添加元素,然后你可以通过索引访问该元素。 袋子与孔托盘不同。