I have developed a windows service .exe having multiple services in it like below:
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1(),
new Service2(),
new Service3(),
new Service4()
};
ServiceBase.Run(ServicesToRun);
}
I am getting following fatal error (checking event logs) on production which is stackoverflow exception:
Faulting application name: MyApp.exe, version: 1.0.0.0, time stamp: 0x522e8317
Faulting module name: clr.dll, version: 4.0.30319.18047, time stamp: 0x58dcff99
Exception code: 0xc00000fd
Fault offset: 0x004226a2
Faulting process id: 0xeb4c
Faulting application start time: 0x01d2a9de37398bdb
Faulting application path: C:\Users\Administrator\Desktop\MyApp.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Report Id: d52424aa-1a16-11e3-bc4b-002590a4ec55
Below is the code for one of my windows service :
private Timer timer1 = null;
private static object _intervalSync = new object();
protected override void OnStart(string[] args)
{
try
{
timer1 = new Timer();
this.timer1.Interval = Convert.ToDouble(900000); // 15mins
this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick);
timer1.Enabled = true;
}
catch (Exception ex)
{
Logger.LogException(ex);
}
}
protected override void OnStop()
{
try
{
timer1.Enabled = false;
timer1.Stop();
}
catch (Exception ex)
{
Logger.LogException(ex);
}
}
private void timer1_Tick(object sender, ElapsedEventArgs e)
{
if (System.Threading.Monitor.TryEnter(_intervalSync))
{
try
{
// execute code
}
catch (Exception ex)
{
Logger.LogException(ex);
}
finally
{
System.Threading.Monitor.Exit(_intervalSync);
}
}
}
Please find the recursive code:
public void fetchInventorySupplyFromAmazon(Parameter parameter, DateTime queryStartDateTime)
{
ListInventorySupplyResponse listInventorySupplyResponse = new ListInventorySupplyResponse();
ListInventorySupplyByNextTokenResponse listInventorySupplyByNextTokenResponse = new ListInventorySupplyByNextTokenResponse();
FBAInventoryDetailServiceMWS fbaInventoryDetailServiceMWS = new FBAInventoryDetailServiceMWS(parameter);
SetParameter setParameter = new SetParameter();
try
{
if (parameter.nextToken != null && parameter.nextToken != "")
{
listInventorySupplyByNextTokenResponse = fbaInventoryDetailServiceMWS.InvokeListInventorySupplyByNextToken(parameter.nextToken);
foreach (var inventorySupply in listInventorySupplyByNextTokenResponse.ListInventorySupplyByNextTokenResult.InventorySupplyList.member)
{
insertUpdateInventory(inventorySupply, parameter);
}
if (listInventorySupplyByNextTokenResponse.IsSetListInventorySupplyByNextTokenResult())
{
setParameter.SetParameterValue(parameter, listInventorySupplyByNextTokenResponse.ListInventorySupplyByNextTokenResult.NextToken);
//recursive call
fetchInventorySupplyFromAmazon(parameter, queryStartDateTime);
}
}
else
{
listInventorySupplyResponse = fbaInventoryDetailServiceMWS.InvokeListInventorySupply(queryStartDateTime);
foreach (var inventorySupply in listInventorySupplyResponse.ListInventorySupplyResult.InventorySupplyList.member)
{
insertUpdateInventory(inventorySupply, parameter);
}
if (listInventorySupplyResponse.ListInventorySupplyResult.NextToken != null && listInventorySupplyResponse.ListInventorySupplyResult.NextToken != "")
{
setParameter.SetParameterValue(parameter, listInventorySupplyResponse.ListInventorySupplyResult.NextToken);
//recursive call
fetchInventorySupplyFromAmazon(parameter, queryStartDateTime);
}
}
}
catch (MarketplaceWebServiceOrdersException ex)
{
if ((!string.IsNullOrEmpty(ex.ErrorCode) ? ex.ErrorCode.ToString().Trim().ToUpper().Equals("NEXTTOKENCORRUPTED") : false) ||
ex.StatusCode.ToString().Trim().ToUpper().Equals("UNAUTHORIZED"))
{
setParameter.SetParameterValue(parameter, null);
//recursive call
fetchInventorySupplyFromAmazon(parameter, queryStartDateTime);
}
else
{
throw;
}
}
catch (Exception)
{
throw;
}
}
Any Help would be great !!
The problem was with my business logic. I have changed the fetchInventorySupplyFromAmazon function to include do while loop instead of recursive calls.
public void fetchInventorySupplyFromAmazon(Parameter parameter, DateTime queryStartDateTime)
{
ListInventorySupplyResponse listInventorySupplyResponse = new ListInventorySupplyResponse();
ListInventorySupplyByNextTokenResponse listInventorySupplyByNextTokenResponse = new ListInventorySupplyByNextTokenResponse();
FBAInventoryDetailServiceMWS fbaInventoryDetailServiceMWS = new FBAInventoryDetailServiceMWS(parameter);
SetParameter setParameter = new SetParameter();
try
{
parameter.nextToken = null;
do
{
if (string.IsNullOrEmpty(parameter.nextToken))
{
listInventorySupplyResponse = fbaInventoryDetailServiceMWS.InvokeListInventorySupply(queryStartDateTime);
if (listInventorySupplyResponse.ListInventorySupplyResult != null)
{
if (listInventorySupplyResponse.ListInventorySupplyResult.InventorySupplyList != null)
{
foreach (var inventorySupply in listInventorySupplyResponse.ListInventorySupplyResult.InventorySupplyList.member)
{
insertUpdateInventory(inventorySupply, parameter);
}
}
setParameter.SetParameterValue(parameter, listInventorySupplyResponse.ListInventorySupplyResult.NextToken);
}
}
else
{
listInventorySupplyByNextTokenResponse = fbaInventoryDetailServiceMWS.InvokeListInventorySupplyByNextToken(parameter.nextToken);
if (listInventorySupplyByNextTokenResponse.ListInventorySupplyByNextTokenResult != null)
{
if (listInventorySupplyByNextTokenResponse.ListInventorySupplyByNextTokenResult.InventorySupplyList != null)
{
foreach (var inventorySupply in listInventorySupplyByNextTokenResponse.ListInventorySupplyByNextTokenResult.InventorySupplyList.member)
{
insertUpdateInventory(inventorySupply, parameter);
}
}
setParameter.SetParameterValue(parameter, listInventorySupplyByNextTokenResponse.ListInventorySupplyByNextTokenResult.NextToken);
}
else
{
setParameter.SetParameterValue(parameter, null);
}
}
} while (!string.IsNullOrEmpty(parameter.nextToken));
}
catch (Exception)
{
throw;
}
}
User contributions licensed under CC BY-SA 3.0