免责声明:不是专业开发人员
我们正在使用SSIS来提取RabbitMQ消息,并且我设法构建了一个C#脚本组件,使用Queue.Dequeue()
从我们的队列中拉出和弹出消息。到现在为止还挺好。但是,我们希望采用某种形式的自动检查,因此我们的SSIS组件不会连续运行,而是可以安排每n分钟运行一次。
我为此找到了Dequeue(int timeout, out object result)
方法,并设法实现它:(我们喜欢BasiocDeliverEventArgs结果以处理消息正文)
object message;
myConsumer.Queue.Dequeue(millisecondsTimeout: 500, result:out message);
BasicDeliverEventArgs ea = (BasicDeliverEventArgs)message;
这似乎有效,但我觉得有些多余。例如,这对我来说似乎更直观:
myConsumer.Queue.Dequeue(millisecondsTimeout: 500
, result:out (BasicDeliverEventArgs)message)
但是这会产生指定无效参数的错误。有人可以解释为什么会抛出该错误,以及为什么该语法无效?
答案 0 :(得分:2)
你不能这样做:
myConsumer.Queue.Dequeue(millisecondsTimeout: 500
, result:out (BasicDeliverEventArgs)message)
因为允许Dequeue
方法将任何 object
分配给message
参数 - 它可能是"string"
等 - 其中会导致VeryBadThings™。
所以不是:你不能这样做。
答案 1 :(得分:1)
Dequeue
方法在第二个参数中接受object
类型。但是你传递的是BasicDeliverEventArgs
类型。这就是你得到错误的原因。如果队列中有Employee
或SomeotherType
,该方法将无法将其分配给BasicDeliverEventArgs
引用。
在方法返回后,调用者将要转换它。
另请阅读MSDN上的这句话:
out关键字导致参数通过引用传递。它类似于ref关键字,除了ref要求变量在传递之前被初始化。要使用out参数,方法定义和调用方法都必须显式使用out关键字
在c#中,几乎所有内容都继承object
,因此您调用的方法可以将任何类型存储在object
引用中(只要它们继承了对象)并将其返回给您。但是它不能在BasicDeliverEventArgs
引用中存储任何类型,这就是为什么它不允许它。