如何解决如何将异步委托连接到事件
在开始之前,我在这里能找到的最接近的是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向我展示我的方式中的错误。
解决方法
问题在于事件订阅不直接支持 MyClass
,因此需要包装器,例如:
替代语法(请参见 EDIT ):
async delegate
我正在使用手机(无法测试代码),因此尽管可以肯定它可以与async Task MyDelegate(object sender,BasicDeliverEventArgs e)
{
// Do stuff
}
Consumer.Received += async (s,e) => await MyDelegate(s,e);
一起使用,但我并不是100%可以与async Task MyDelegate(...)
一起使用;尽管从理论上讲应该如此。
EDIT :删除,然后根据OP的请求恢复我的答案(很高兴它具有一定的价值);终于来到电脑上,并验证了@CamiloTerevinto在评论中所验证的所有三种订阅方法都有效,以及我最初删除此答案的原因:
async delegate MyDelegate(...)
总结:无需包装。我很高兴我最初的回答对OP很有价值;我添加此编辑内容是为了确保答案的完整性/正确性,希望对其他人有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。