C# 运行循环时出现内存不足异常

C# 运行循环时出现内存不足异常,c#,.net,C#,.net,我在这一点上感到困惑,我有以下代码: while (dal.Read()) { if (FiltersAppliedForThisJob(dal.GetInt(0))) continue; var j = 0; if (SettingsManager.OpsMgrSettings.JobViewServiceLis

我在这一点上感到困惑,我有以下代码:

            while (dal.Read())
            {

                if (FiltersAppliedForThisJob(dal.GetInt(0)))
                   continue;
                var j = 0;
                if (SettingsManager.OpsMgrSettings.JobViewServiceList.IsNotNull() &&
                    SettingsManager.OpsMgrSettings.JobViewServiceList.Count > 0)
                    if (!ThisJobHasASupportedService(dal.GetInt(0)))
                        continue;

                var newJobGridRow = AddRowToJobGridWithJobID(dal.GetInt(0),
                                                             ref j);
                BoldThisJobGridRowIfItIsUpdated(newJobGridRow, dal);
                var jobno = dal2.GetJobNo(dal.GetInt(0).ToString());
                if (locns2view.Length > 0)
                    _jobgrid.Rows[newJobGridRow].Visible = locns2view.Contains(jobno.Substring(0, 2));

                var col = 2;
                if (j < _jobgrid.ColumnCount)
                    for (i = 0; i < str1.Length; i++)
                    {
                        if (str1[i].Length <= 0)
                            continue;

                        if (!dal.IsFieldNull(col))
                            PlaceValuesInJobGridCells(dtype, i, dal2, str1, jobno, newJobGridRow, j, dal, col);
                        j++;
                        col++;
                    }
                if (_jobgrid[0, newJobGridRow].Value.ToString() == prevjobid)
                    _jobgrid.Rows[newJobGridRow].Selected = true;
            }

            SortJobGridColumns();
        }
另外,如果我删除函数调用
FiltersAppliedForThisJob(dal.GetInt(0)
,我不会得到一个错误消息

以下是功能代码:

  private bool FiltersAppliedForThisJob(int p)
    {
        var filter_datefrom = SettingsManager.OpsMgrSettings.MainView_DateFrom;
        var filter_dateto = SettingsManager.OpsMgrSettings.MainView_DateTo;
        var filter_status = SettingsManager.OpsMgrSettings.MainView_JobStatus;
        var jobNumTbl = dal.Get_JobNumber(p);
        var jobStatus = GetJobStatus(p);
        var jobdate = jobNumTbl.Date;
        var jobdate_res = false;
        var jobstat_res = false;
        var isFiltered = false;

        if (jobdate.HasValue)
        {
            //both have values
            if (filter_datefrom.HasValue && filter_dateto.HasValue)
            {
                if (DateTime.Compare(jobdate.Value.Date, filter_datefrom.Value.Date) < 0 ||
                    DateTime.Compare(jobdate.Value.Date, filter_dateto.Value.Date) > 0)
                    jobdate_res = true;
            }
            //only datefrom has value
            else if (filter_datefrom.HasValue)
            {
                if (DateTime.Compare(jobdate.Value.Date, filter_datefrom.Value.Date) < 0)
                    jobdate_res = true;
            }
            //only datato has value
            else if (filter_dateto.HasValue)
            {
                if (DateTime.Compare(jobdate.Value.Date, filter_dateto.Value.Date) > 0)
                    jobdate_res = true;
            }
        }

        if (jobStatus.HasValue)
        {
            if (!filter_status.Equals(2))
                if (!filter_status.Equals(jobStatus))
                    jobstat_res = true;
        }

        if (jobdate_res || jobstat_res)
            isFiltered = true;


        return isFiltered;
    }
private bool filters应用于此作业(int p)
{
var filter_datefrom=SettingsManager.OpsMgrSettings.MainView_datefrom;
var filter_dateto=SettingsManager.OpsMgrSettings.MainView_dateto;
var filter_status=SettingsManager.OpsMgrSettings.MainView_作业状态;
var jobNumTbl=dal.Get_JobNumber(p);
var jobStatus=GetJobStatus(p);
var jobdate=jobNumTbl.Date;
var jobdate_res=假;
var jobstat_res=假;
var isFiltered=false;
if(jobdate.HasValue)
{
//两者都有价值
if(filter\u datefrom.HasValue&&filter\u dateto.HasValue)
{
if(DateTime.Compare(jobdate.Value.Date,filter_datefrom.Value.Date)<0||
DateTime.Compare(jobdate.Value.Date,filter_dateto.Value.Date)>0)
jobdate_res=真;
}
//只有datefrom才有价值
else if(filter_datefrom.HasValue)
{
if(DateTime.Compare(jobdate.Value.Date,filter_datefrom.Value.Date)<0)
jobdate_res=真;
}
//只有datato有值
else if(filter_dateto.HasValue)
{
if(DateTime.Compare(jobdate.Value.Date,filter_dateto.Value.Date)>0)
jobdate_res=真;
}
}
if(jobStatus.HasValue)
{
如果(!filter_status.Equals(2))
如果(!filter_status.Equals(作业状态))
jobstat_res=真;
}
如果(工作日期|工作状态|工作状态|
isFiltered=true;
返回被过滤;
}

不确定这是否是足够的信息。如果您需要我提供更多信息,请告诉我。

问题已解决。应用程序在筛选之前从数据库中提取了所有信息,这是大量数据。在加载数据之前,我在查询中添加了额外的筛选。现在一切都很好。谢谢大家。

您调试并查看了吗它被调用了多少次,还要检查任务管理器以查看每个循环使用的内存。这是很多代码,你能缩小搜索范围吗?是的,任务管理器跳得很高,除非我将消息框扔到那里,或者移除为该作业应用的
过滤器
函数调用在包含
的方法上设置断点e> 循环。当它点击它时,然后点击F5。如果它再次点击它,请检查您的调用堆栈以查看它来自何处。如果这不是罪魁祸首,请尝试使用您正在调用的其他方法。您可能会在不知道的情况下进行递归调用。OutOfMemoryException发生时的堆栈跟踪是什么?
  private bool FiltersAppliedForThisJob(int p)
    {
        var filter_datefrom = SettingsManager.OpsMgrSettings.MainView_DateFrom;
        var filter_dateto = SettingsManager.OpsMgrSettings.MainView_DateTo;
        var filter_status = SettingsManager.OpsMgrSettings.MainView_JobStatus;
        var jobNumTbl = dal.Get_JobNumber(p);
        var jobStatus = GetJobStatus(p);
        var jobdate = jobNumTbl.Date;
        var jobdate_res = false;
        var jobstat_res = false;
        var isFiltered = false;

        if (jobdate.HasValue)
        {
            //both have values
            if (filter_datefrom.HasValue && filter_dateto.HasValue)
            {
                if (DateTime.Compare(jobdate.Value.Date, filter_datefrom.Value.Date) < 0 ||
                    DateTime.Compare(jobdate.Value.Date, filter_dateto.Value.Date) > 0)
                    jobdate_res = true;
            }
            //only datefrom has value
            else if (filter_datefrom.HasValue)
            {
                if (DateTime.Compare(jobdate.Value.Date, filter_datefrom.Value.Date) < 0)
                    jobdate_res = true;
            }
            //only datato has value
            else if (filter_dateto.HasValue)
            {
                if (DateTime.Compare(jobdate.Value.Date, filter_dateto.Value.Date) > 0)
                    jobdate_res = true;
            }
        }

        if (jobStatus.HasValue)
        {
            if (!filter_status.Equals(2))
                if (!filter_status.Equals(jobStatus))
                    jobstat_res = true;
        }

        if (jobdate_res || jobstat_res)
            isFiltered = true;


        return isFiltered;
    }