Item enqueue in concurrent queue is not adding

Viewed 62

I am working on an application in which I am getting orders from an third party app. The application is written on windows form so I am using service stack to add routes in my application.

I have three classes. One contains endpoint

public class Service : ServiceStack.Service
{
    Repository _repository;
    public OrderService()
    {
        _repository = Repository.GetInstance();
    }

    [Authenticate]
    public void Post(Order order)
    {
        if (order != null)
        {
            _repository.AddItem(order);
        }
    }
}

The second class is processing the orders and this class is a singleton class.

public sealed class Repository
{
    private static object _myLock = new object();
    private static Repository _mySingleton = null;
    private ConcurrentQueue<Order> _queue;
    public static bool orderCheck = true;

    private Repository() {
        _queue = new ConcurrentQueue<Order>();
    }

    public void AddItem(Order order)
    {
        _queue.Enqueue(order);
    }

    public static Repository GetInstance()
    {
        if (_mySingleton == null)
        {
            lock (_myLock)
            {
                if (_mySingleton == null)
                {
                    _mySingleton = new Repository();
                }
            }
        }

        return _mySingleton;
    }

    public void CreateOrder()
    {
        
        while (orderCheck)
        {
            Order order = null;
            _queue.TryDequeue(out order);
            if (order != null)
            {
                try
                {
                        // performing business logic with order
                    
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
            else
            {
                Thread.Sleep(10000);
            }
        }
    }
}

The third class creates a new thread when the application is started:

new Thread(delegate ()
{
    var repo = Repository.GetInstance();
    repo.CreateOrder();
}).Start();

The problem is that the endpoint added the order information in the queue, but when I try to dequeue in the Repository class then it's not available on the tryDequeue method.

I put the getHashCode of ConcurrentQueue and I found the hashcode showing differently in while loop and in AddItem method.

0 Answers
Related