如何在C#

时间:2018-09-22 04:32:48

标签: c# garbage-collection rabbitmq

我正在C#中使用RabbitMQ进行实验,而我的C#消费者项目使用了过多的内存却遇到了问题。

我有两个C#应用程序。首先是将消息发布到队列。另一种是使用来自同一队列的消息。

发布c#程序正常。它可以实现预期的效果。

然而,消费者应用程序从队列中消耗了foreach消息,它使用了更多的内存,而且似乎没有被垃圾回收。

我从队列中使用的Foreach消息,我使用newtonsofts json库反序列化它并将其放入对象中。然后,我对该对象进行评估,并继续进行队列中的下一条消息。

我的对象

public class MyObject : IDisposable
{
    public int Id { get; set; }
    public string Name { get; set; }

    public void Dispose()
    {
        GC.SuppressFinalize(this);
    }

    ~OrderDoneMessage()
    {
        Dispose();
    }
}

这是我设置消费者的方式:

    public void RabbitMQListener(object obj)
    {
        var token = (CancellationToken)obj;

        var factory = new ConnectionFactory { HostName = Hostname };
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            SetupEventHandler(channel, $"MyObjExchange_{nameof(MyObject).ToLower()}", MyObject);

            while (!token.IsCancellationRequested)
            {
                Thread.Sleep(100);
            }
        }
    }

    private void SetupEventHandler(IModel channel, string queueName, EventHandler<BasicDeliverEventArgs> handler)
        {
        // Create queues if they do not exist
        var exchangeName = $"MyObjExchange_{nameof(MyObject).ToLower()}";

        channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout);
        channel.QueueDeclare(queueName, false, false, false, null);
        channel.QueueBind(queueName, exchangeName, string.Empty, null);

        var consumer = new EventingBasicConsumer(channel);

        consumer.Received += handler;
        channel.BasicConsume(queueName, true, consumer);
    }

    private void OnMyObjectMessage(object model, BasicDeliverEventArgs ea)
    {
        var body = ea.Body;
        var message = Encoding.UTF8.GetString(body);

        var myObj = JsonConvert.DeserializeObject<MyObject>(message)

        if(myObj.Id == Guid.Empty)
        {
           // Do stuff
        }
    }

当我运行该程序时,似乎OnMyObjectMessage方法中的消息永远不会被垃圾回收,因此会消耗越来越多的内存。

任何帮助您了解这一点的帮助

0 个答案:

没有答案