【发布时间】:2020-11-30 07:56:30
【问题描述】:
在我开始之前,我在这里能找到的最接近的答案是 How do you implement an async action delegate method? 但是,作为一个有点小脑袋的熊,我无法让我的脑细胞围绕答案以及它如何适用于我当前的问题。
我正在围绕 RabbitMq C# 客户端编写一个包装器,但我的委托和异步事件有问题。
这段代码看起来很好:
private Action<object, BasicAckEventArgs> _syncHandlerBasicAck;
private Action<object, BasicNackEventArgs> _syncHandlerBasicNack;
在这里定义代码:
_syncHandlerBasicAck = delegate(object o, BasicAckEventArgs args)
{
//[Do stuff here]
};
_syncHandlerBasicNack = delegate(object o, BasicNackEventArgs args)
{
//[Do stuff here]
};
然后使用它:
Channel.BasicAcks += _syncHandlerBasicAck.Invoke;
Channel.BasicNacks += _syncHandlerBasicNack.Invoke;
我遇到的问题是异步 BasicDeliver 事件。这是我当前的代码:
private Func<object, BasicDeliverEventArgs, Task> _syncHandlerIncomingMessage;
紧随其后
_syncHandlerIncomingMessage = async delegate(object o, BasicDeliverEventArgs args)
{
//[Do stuff here]
};
但是每当我尝试这样做时:
Consumer.Received += _syncHandlerIncomingMessage.Invoke;
我收到 System.NullReferenceException 告诉我
对象引用未设置为对象的实例。
我看到有一个可用的 BeginInvoke 方法,但我不确定这是否适用于我目前的情况,因为我没有使用回调,只是想异步调用它。
有人指点吗? (我什至会采用“重复问题:在此处回答”类型的回复,因为我确信我可能遗漏了什么)。
编辑
我有两个问题;一个是把它连接起来,另一个是一些重构妨碍了我!非常感谢@Coolbots 的回答和@Camilo 向我展示我的方式的错误。
【问题讨论】:
-
我对您订阅事件的方式感到困惑。你能不做
Channel.BasicAcks += (object o, BasicAckEventArgs args) => { //[Do stuff here] };和/或Channel.BasicAcks += async (object o, BasicAckEventArgs args) => { //[Do stuff here] };吗? -
我正在尝试创建一些更简洁的代码@GSerg。我最初是这样的,我的外部方法变得有点毛茸茸。也就是说,我仍然想知道您如何做到这一点,因为在我看来,您应该能够做到这一点。
-
您的
async delegate可以是返回async Task的自己的方法(而不是存储在_syncHandlerIncomingMessage中的匿名方法),并将该方法分配给Consumer.Received? -
想用答案扩展它,@CoolBots 吗?
-
我不认为错误来自发布的代码。我刚刚在控制台应用程序(没有 RabbitMQ 依赖项)上对此进行了测试,它适用于
Consumer.Received += x.Invoke;
标签: c# async-await