 I got a tip that it might be that fact that I never dispose my datasets.
I have tried to dispose all datasets both in the windows version and the web version. No luck with the windows application though, still eats CPU.
When I test this I only use one page so the code is quite simple. We have one Main form that handles what page to show etc and one subform that displays the data.
Here is the code that is executed every 10 seconds from the main form:
private void timer2_Tick(object sender, System.EventArgs e)<br />
{<br />
YO.WindowState = FormWindowState.Maximized;<br />
TS.WindowState = FormWindowState.Maximized;<br />
MG.WindowState = FormWindowState.Maximized;<br />
DG.WindowState = FormWindowState.Maximized;<br />
<br />
string sTime = dataContainer.getTime().ToString();<br />
string sLimit = dataContainer.getLimit().ToString();<br />
string sVolume = dataContainer.getVolume().ToString();<br />
string sPages = dataContainer.getPages();<br />
string sProducts = dataContainer.getProducts();<br />
string sUnits = dataContainer.getUnits();<br />
<br />
ArrayList arrPages = YieldMonitorEngine.ExtractPages(dataContainer.getPages());<br />
ArrayList arrProducts = YieldMonitorEngine.ExtractProducts(dataContainer.getProducts());<br />
<br />
switch (int.Parse(sPageToView))<br />
{<br />
case AppConstants.MONITOR_YIELD_OVERVIEW: <br />
<br />
YO.InitializePage (int.Parse(sPageToView), int.Parse(sProductToView), int.Parse(sTime), <br />
double.Parse(sLimit), int.Parse(sVolume), sPages, sProducts, sUnits);<br />
MG.Hide();<br />
DG.Hide();<br />
TS.Hide();<br />
YO.Show();<br />
YO.Refresh();<br />
YO.Update();<br />
break;<br />
case AppConstants.MONITOR_YIELD_DETAILS_MONTHLY_GRAPH:<br />
MG.InitializePage (int.Parse(sPageToView), int.Parse(sProductToView), int.Parse(sTime), <br />
double.Parse(sLimit), int.Parse(sVolume), sPages, sProducts, sUnits);<br />
MG.Show();<br />
MG.Refresh();<br />
MG.Update();<br />
YO.Hide();<br />
DG.Hide();<br />
TS.Hide();<br />
break;<br />
case AppConstants.MONITOR_YIELD_DETAILS_DAILY_GRAPH:<br />
DG.InitializePage (int.Parse(sPageToView), int.Parse(sProductToView), int.Parse(sTime), <br />
double.Parse(sLimit), int.Parse(sVolume), sPages, sProducts, sUnits);<br />
DG.Show();<br />
DG.Refresh();<br />
DG.Update();<br />
YO.Hide();<br />
MG.Hide();<br />
TS.Hide();<br />
break;<br />
case AppConstants.MONITOR_TOP_SYMPTOMS:<br />
TS.InitializePage (int.Parse(sPageToView), int.Parse(sProductToView), int.Parse(sTime), <br />
double.Parse(sLimit), int.Parse(sVolume), sPages, sProducts, sUnits);<br />
TS.Show();<br />
TS.Refresh();<br />
TS.Update();<br />
YO.Hide();<br />
MG.Hide();<br />
DG.Hide();<br />
break;<br />
}<br />
<br />
<br />
string sLastViewedProduct = sProductToView;<br />
string sLastViewedPage = sPageToView;<br />
<br />
int iIndexOfLastViewedProduct = arrProducts.IndexOf(sLastViewedProduct.ToString());<br />
<br />
if (iIndexOfLastViewedProduct + 1 < arrProducts.Count) <br />
{<br />
sProductToView = arrProducts[iIndexOfLastViewedProduct + 1].ToString();<br />
sPageToView = sLastViewedPage;<br />
}<br />
else <br />
{<br />
sProductToView = arrProducts[0].ToString();<br />
<br />
int iIndexOfLastViewedPage = arrPages.IndexOf(sLastViewedPage.ToString());<br />
<br />
if (iIndexOfLastViewedPage + 1 < arrPages.Count) <br />
{<br />
sPageToView = arrPages[iIndexOfLastViewedPage + 1].ToString();<br />
}<br />
else <br />
{<br />
sPageToView = arrPages[0].ToString();<br />
}<br />
}<br />
<br />
arrPages.Clear();<br />
arrProducts.Clear();<br />
}
When I test the application I only test with the case AppConstants.MONITOR_TOP_SYMPTOMS, so that's the code that is executed. The TS.InitializePage code looks like this:
public void InitializePage (int iPageToView, int iProductToView, int iTime, double dLimit, int iVolume,<br />
string sPages, string sProducts, string sUnits) <br />
{<br />
dgUnit1.DataSource = null;<br />
dgUnit2.DataSource = null;<br />
dgUnit3.DataSource = null;<br />
dgUnit4.DataSource = null;<br />
<br />
DateTime dtTestDate = DateTime.Parse(DateTime.Now.AddDays(iNoDaysFromTodayToView).ToShortDateString());<br />
ArrayList arrProducts = YieldMonitorEngine.ExtractProducts(sProducts);<br />
ArrayList arrUnitGroups = YieldMonitorEngine.ExtractUnitGroups(sUnits);<br />
<br />
ArrayList arrUnitsForProduct = YieldMonitorEngine.ExtractUnitsForProduct(iProductToView, arrProducts, arrUnitGroups);<br />
<br />
DataSet dsProduct = YieldMonitorEngine.GetProductInfo(iProductToView);<br />
<br />
if (dsProduct != null && dsProduct.Tables[0].Rows.Count > 0) <br />
{<br />
string sModelName = dsProduct.Tables[0].Rows[0][DBConstants.PRODUCT_MODEL].ToString();<br />
<br />
lblTitle.Text = "Top Symptoms for " + sModelName + " - " + dtTestDate.ToString("MMMM d, yyyy");<br />
}<br />
<br />
if (arrUnitsForProduct.Count > 0) <br />
{<br />
dgUnit1.Visible = true;<br />
InitializeDataGrid(int.Parse(arrUnitsForProduct[0].ToString()), iProductToView, dtTestDate, dgUnit1, lblUnit1, dLimit, iVolume);<br />
}<br />
else <br />
{<br />
dgUnit1.Visible = false;<br />
}<br />
<br />
if (arrUnitsForProduct.Count > 1) <br />
{<br />
dgUnit2.Visible = true;<br />
InitializeDataGrid(int.Parse(arrUnitsForProduct[1].ToString()), iProductToView, dtTestDate, dgUnit2, lblUnit2, dLimit, iVolume);<br />
}<br />
else <br />
{<br />
dgUnit2.Visible = false;<br />
}<br />
<br />
if (arrUnitsForProduct.Count > 2) <br />
{<br />
dgUnit3.Visible = true;<br />
InitializeDataGrid(int.Parse(arrUnitsForProduct[2].ToString()), iProductToView, dtTestDate, dgUnit3, lblUnit3, dLimit, iVolume);<br />
}<br />
else <br />
{<br />
dgUnit3.Visible = false;<br />
}<br />
<br />
if (arrUnitsForProduct.Count > 3) <br />
{<br />
dgUnit4.Visible = true;<br />
InitializeDataGrid(int.Parse(arrUnitsForProduct[3].ToString()), iProductToView, dtTestDate, dgUnit4, lblUnit4, dLimit, iVolume);<br />
}<br />
else <br />
{<br />
dgUnit4.Visible = false;<br />
}<br />
<br />
dsProduct.Dispose();<br />
arrProducts.Clear();<br />
arrUnitGroups.Clear();<br />
arrUnitsForProduct.Clear();<br />
}<br />
<br />
<br />
private void InitializeDataGrid(int iSupplyUnitID, int iProductID, DateTime dtTestDate, DataGrid dgUnit, Label lblUnit, double dSymptomLimit, int iMinStationVolume)<br />
{<br />
try <br />
{<br />
DataSet dsSupplyUnit = YieldMonitorEngine.GetSupplyUnitInfo(iSupplyUnitID);<br />
if (dsSupplyUnit != null && dsSupplyUnit.Tables[0].Rows.Count > 0) <br />
{<br />
lblUnit.Text = dsSupplyUnit.Tables[0].Rows[0][DBConstants.SUPPLY_UNIT_SHORT_NAME].ToString();<br />
}<br />
<br />
DataSet dsTopSymptoms = YieldMonitorEngine.GetSymptomYieldDailySUMTopSymptoms(iSupplyUnitID, iProductID, dtTestDate, dSymptomLimit, iMinStationVolume);<br />
dsTopSymptoms.Tables[0].TableName = "TopSymptoms"; <br />
dgUnit.DataSource = dsTopSymptoms.Tables["TopSymptoms"];<br />
<br />
if (dsTopSymptoms.Tables["TopSymptoms"].Rows.Count == 0)<br />
{<br />
dgUnit.Visible = false;<br />
}<br />
else<br />
{<br />
dgUnit.Visible = true;<br />
}<br />
<br />
dsTopSymptoms.Dispose();<br />
dsSupplyUnit.Dispose();<br />
<br />
dgUnit.Enabled = false;<br />
<br />
DataGridTableStyle dgts = new DataGridTableStyle();<br />
<br />
dgts = new DataGridTableStyle();<br />
dgts.MappingName = "TopSymptoms";<br />
<br />
dgts.AlternatingBackColor = Color.LightGray;<br />
<br />
DataGridTextBoxColumn TextCol = new DataGridTextBoxColumn();<br />
TextCol.MappingName = "SymptomName";<br />
TextCol.HeaderText = "Symptom";<br />
TextCol.ReadOnly = true;<br />
TextCol.Width = 250;<br />
dgts.GridColumnStyles.Add(TextCol);<br />
<br />
TextCol = new DataGridTextBoxColumn();<br />
TextCol.MappingName = "StationName";<br />
TextCol.HeaderText = "Station";<br />
TextCol.ReadOnly = true;<br />
TextCol.Width = 250;<br />
dgts.GridColumnStyles.Add(TextCol);<br />
<br />
TextCol = new DataGridTextBoxColumn();<br />
TextCol.MappingName = "YieldLossTest1";<br />
TextCol.HeaderText = "Yield Loss";<br />
TextCol.Format = "P";<br />
TextCol.ReadOnly = true;<br />
TextCol.Width = 250;<br />
dgts.GridColumnStyles.Add(TextCol);<br />
<br />
dgts.RowHeadersVisible = false;<br />
<br />
dgUnit.TableStyles.Clear(); <br />
<br />
<br />
dgUnit.TableStyles.Add(dgts);<br />
}<br />
catch (Exception ex) <br />
{<br />
string ssfsfs = "";<br />
}<br />
}
Can it be that I for some reason have some objects that I havn't disposed that I should? I thought .NET handled this automatically but seems like it wasn't that easy?
|