I am new to parallel programming. I am using Parallel.Invoke() to execute 6 functions that are independent and can run parallel to each other.
I am trying to monitor the CPU and memory Utilization for my code looking at task manager. I have Intel CORE i3 system and 4GB RAM.
What I notice is maximum CPU Usage goes to 30-40% and even Memory usage is 30% at max.
How can I utilize more CPU and memory? I am not running any other app. How Parallel.Invoke() is handled by TPL and how much usage will increase for more available cores and RAM.?
My Code sample:
int concurrencyLevel = Environment.ProcessorCount*2;
ParallelOptions p=new ParallelOptions{MaxDegreeOfParallelism=concurrencyLevel};
Parallel.Invoke(p,() =>
{
if (elementForm.ImplementationcheckBox.Checked)
{
ImplementationDataType();
}
}, () =>
{
if (elementForm.PrimitivecheckBox.Checked)
{
ApplicationPrimitiveDataType();//No need to add in diagram.
}
//Empty diagram
}, () =>
{
if (elementForm.ArraycheckBox.Checked)
{
ApplicationArrayDataType();//No need to add in diagram.
}
}, () =>
{
if (elementForm.RecordcheckBox.Checked)
{
ApplicationRecordDataType();
}
}, () =>
{
if (elementForm.CompositioncheckBox.Checked)
{
SenderReciverInterface();
ApplicationSWComponentType();
CompositionSwComponentType();
}
}, () =>
{
if (elementForm.MappingcheckBox.Checked)
{
DataTypeMappingSet();
}
});
where each function is as below:
private void DataTypeMappingSet()
{
List<int> indexes = getPackageAndElementsIndex("DATA-TYPE-MAPPING-SET");
if (indexes != null)
{
try
{
ElementTag elementTag = null;
int elementId = 0;
string elementName = null;
String elementNameAndId = null;
List<int> elementChildElements = null;
ElementTag ParentDiagramtag = null;
string parentDiagramName = null;
ElementTag parentPackagetag = null;
string parentPackageName = null;
EA.Package parentPackage;
EA.Diagram parentDiagram = null; ;
EA.Element DataTypeMappingSetElement;
foreach (int index in indexes)
{
elementTag = parsedFile.store_element[index];
elementId = elementTag.Element_id;
elementName = parsedFile.duplicate_element_array [elementTag.Tag_array_ref].Key;
elementChildElements = elementTag.Child_index;
ParentDiagramtag = parsedFile.store_element[elementTag.Parent_index];
parentDiagramName = parsedFile.duplicate_element_array[ParentDiagramtag.Tag_array_ref].Key;
parentDiagramName = parentDiagramName + ParentDiagramtag.Element_id;
parentPackagetag = parsedFile.store_element[ParentDiagramtag.Parent_index];
parentPackageName = parsedFile.duplicate_element_array[parentPackagetag.Tag_array_ref].Key;
parentPackageName = parentPackageName + parentPackagetag.Element_id;
parentPackage = getPackageObjByName[parentPackageName];
parentDiagram = getDiagramObjByName[parentDiagramName];
DataTypeMappingSetElement = (EA.Element)parentPackage.Elements.AddNew("", "Data-Type-Mapping-Set");
DataTypeMappingSetElement.Update();
elementNameAndId = elementName + elementId;
getElementObjByName.TryAdd(elementNameAndId, DataTypeMappingSetElement);
AddTagValues(DataTypeMappingSetElement, elementChildElements);
//EA.DiagramObject
DiagOb = (EA.DiagramObject)parentDiagram.DiagramObjects.AddNew("", "");
//DiagOb.ElementID = DataTypeMappingSetElement.ElementID;
//DiagOb.Update();
createDataTypeMap(elementTag.Child_index, DataTypeMappingSetElement, parentDiagramName, parentPackage);
});
}
catch (Exception)
{
// throw;
}
}
}