Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何响应不同线程上的事件_C#_Multithreading_Rabbitmq - Fatal编程技术网

C# 如何响应不同线程上的事件

C# 如何响应不同线程上的事件,c#,multithreading,rabbitmq,C#,Multithreading,Rabbitmq,我实现了一个rabbitMQ侦听器,它实际上只是坐在一个循环中等待消息到达。当消息到达时,我希望触发一个事件并运行一些代码 然而,我似乎并不总是收到这个事件,我想知道这是否是因为我在另一个线程上运行代码的队列轮询部分 不过,它一开始似乎确实有效,因此线程可能不是问题所在。有人能给我一个意见吗 队列侦听器: public void CreateQueueListener<T>() where T : IPubSubEvent { va

我实现了一个rabbitMQ侦听器,它实际上只是坐在一个循环中等待消息到达。当消息到达时,我希望触发一个事件并运行一些代码

然而,我似乎并不总是收到这个事件,我想知道这是否是因为我在另一个线程上运行代码的队列轮询部分

不过,它一开始似乎确实有效,因此线程可能不是问题所在。有人能给我一个意见吗

队列侦听器:

 public void CreateQueueListener<T>() where T : IPubSubEvent
    {            

        var mqServer = new RabbitMqServer(m_RabbitMqAddress);
        var mqClient = (RabbitMqQueueClient)mqServer.MessageFactory.CreateMessageQueueClient();

        var channel = mqClient.Channel;
        string queueName = mqClient.GetTempQueueName();


        channel.QueueBind(queueName, m_EventExchange, routingKey: QueueNames<T>.In);

        var consumer = new RabbitMqBasicConsumer(channel);
        channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);
        Task.Run(() =>
        {
            while (true)
            {
                BasicGetResult basicGetResult;
                try
                {
                    basicGetResult = consumer.Queue.Dequeue();
                }

                catch (Exception ex)
                {
                    throw;
                }
                var message = basicGetResult.ToMessage<T>();
                PublishEvent?.Invoke(this, new PubSubEventArgs { EventData = message.GetBody().EventName });                    
            }
        });
    }
public void CreateQueueListener(),其中T:IPubSubEvent
{            
var mqServer=new RabbitMqServer(m_RabbitMqAddress);
var mqClient=(RabbitMqQueueClient)mqServer.MessageFactory.CreateMessageQueueClient();
var channel=mqClient.channel;
字符串queueName=mqClient.GetTempQueueName();
QueueBind(queueName,m_EventExchange,routingKey:QueueNames.In);
var消费者=新RabbitMqBasicConsumer(通道);
channel.BasicConsume(队列:queueName,自动确认:true,使用者:使用者);
Task.Run(()=>
{
while(true)
{
BasicGetResult BasicGetResult;
尝试
{
basicGetResult=consumer.Queue.Dequeue();
}
捕获(例外情况除外)
{
投掷;
}
var message=basicGetResult.ToMessage();
PublishEvent?.Invoke(这是新的PubSubEventArgs{EventData=message.GetBody().EventName});
}
});
}
消费类

public class MyClass
{
 public MyClass(IEventClient eventClient)
    {
        eventClient.CreateQueueListener<AuthoriseEvent>();
        eventClient.PublishEvent += OnPublishEvent;
    }

    private async void OnPublishEvent(object sender, PubSubEventArgs e)
    {
        if (e.EventData == "AuthoriseEvent")
            //dostuff
    }
}
公共类MyClass
{
公共MyClass(IEventClient事件客户端)
{
eventClient.CreateQueueListener();
eventClient.PublishEvent+=OnPublishEvent;
}
PublisheEvent上的专用异步void(对象发送方,PubSubEventArgs e)
{
如果(如事件数据==“授权事件”)
//多斯塔夫
}
}
我正在另一个线程上运行代码的队列轮询部分

据我所知,.NET客户端不支持这一点


注意:RabbitMQ团队监视并仅有时回答有关StackOverflow的问题