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

基本的に、そのようなイベントを参照することはできません。2 つのオプション:

  • 「ハンドラーの追加」と「ハンドラーの削除」のデリゲートを渡します。

    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 に答える