6

好吧,我真的不知道我的代码出了什么问题,怎么回事

class Activity有以下方法

protected struct EventParams
    {
        public object sender;
        public EventArgs e;
    }
private EventParams WaitEventRaise_Body(ref EventHandler<EventArgs> handler, int timeout)
    {
        AutoResetEvent receiver = new AutoResetEvent(false);
        EventParams result = new EventParams();

        EventHandler<EventArgs> handle = new EventHandler<EventArgs>((sender, e) =>
        {
            result.e = e;
            result.sender = sender;
            receiver.Set();
        });

        handler += handle;

        if (timeout > 0)
        {
            receiver.WaitOne(timeout);
        }
        else
        {
            receiver.WaitOne();
        }

        return result;
    }

protected EventParams WaitEventRaise(ref EventHandler<EventArgs> handler)
{
    return WaitEventRaise_Body(ref handler, -1);
}
protected EventParams WaitEventRaise(ref EventHandler<EventArgs> handler, int timeout)
{
    return WaitEventRaise_Body(ref handler, timeout);
}

好的,所以我发现自己一遍又一遍地编写 AutoResetEvent 的东西,所以我决定创建一个方法。但是当我尝试从派生类调用这个方法时Bot : Activity

EventParams eventResult = WaitEventRaise(ref currentJob.JobReported);

错误 30 Project.Activity.WaitEventRaise(ref System.EventHandler)' 的最佳重载方法匹配有一些无效参数

currentJob 是一个Job : Activity有事件的类

public event EventHandler<JobReport> JobReported;

class JobReport : EventArgs

我想要做的是有一个机器人来完成工作,实际上它会创建工作并等待他们完成工作。Job 类在内部引发事件以使 bot 类注意到它完成了工作。机器人类一直等到工作引发事件。所以我希望它清楚。我很抱歉英语不是我的母语。

4

2 回答 2

9

基本上,您不能引用这样的事件。两种选择:

  • 为“添加处理程序”和“删除处理程序”传递委托:

    EventParams eventResult = 
        WaitEventRaise<JobReport>(handler => currentJob.JobReported += handler,
                                  handler => currentJob.JobReported -= handler);
    

    whereWaitEventRaise将被声明为:

    EventParams WaitEventRaise<T>(Action<EventHandler<T>> add,
                                  Action<EventHandler<T>> remove)
                                 where T : EventArgs
    
  • 传入EventInfo与事件相对应的事件,您将通过反射获取该事件

这些都不是非常令人愉快的——这也是 Rx 遇到的问题。

于 2013-07-30T13:15:57.313 回答
0

我不知道Job类包含什么或什么currentJob.JobReported是什么,但从错误WaitEventRaise方法需要判断System.EventHandler哪个是类似的方法

private void MeMethod(object sender, EventArgs e)
{
}
于 2013-07-30T13:14:42.093 回答