Stackoverflow exception (0xc00000fd) in Windows service

-2

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 !!

c#
asp.net
windows-services
asked on Stack Overflow Apr 1, 2017 by Jayakrishnan Gounder • edited Apr 1, 2017 by Jayakrishnan Gounder

1 Answer

0

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