2

私は読んで読んでいますが、それでもポイントとデリゲート/イベントおよび発行者/サブスクライバーの使用方法を理解できませんか?デリゲートは1つ以上のメソッドへの参照を含むクラスであり、メソッドを別のメソッドに送信するために使用されることを知っています。

私が得られないのは、出版社/購読者の役割をどのように決定すべきかということです。例を見てみましょう。タクシーセントラルとそれはタクシーです。タクシーセントラルはパブリッシャーであり、タクシーは加入者ですか?タクシーセントラルから運転注文を取得するにはどうすればよいですか?しかし、タクシーは出版社であり、そこに位置し、タクシーの加入者であるタクシーセントラルに向かっている住所を報告することもできます!?

インスピレーションが必要です。これがどのように機能しているかを確認するための初心者向けコードを探しています。この回答に簡単なコードで返信する時間が残っている人はいますか?ありがとう!

4

3 に答える 3

2

Another way to think of events, publishers/subscribers, etc...is to think of the cloud and the way it tends to function. In a cloud based system, any entity can register to listen for any type of event, OR can publish any event that it wants. Anyone listening, will get that data.

In your example: Taxi central could publish/push events like Shift Change, Traffic Accident as (Location), Taxi Requested at (Location), or other similar things that the entire group of cabs would be listening for. The individual cabs would be publishing things like Pickup At (Location), Drop Off at (Location), Accident at (Location); that Central would be logging for its own purposes. Other cabs could if they wanted to ALSO be listening for these same events, so that they would know where and how close other cabs are to their own location, or if there is an accident that another cab reported, or similar.

Cloud events however are a specific implementation of the event system. Its much more common to specifically subscribe to events. A cab object, when created, would immediately subscribe itself to the Central events, and the central system when dispatching the cab would make certain that it subscribed itself to that cab's events.

In this way, both objects serve the role of both publisher and subscriber. Its only really specific to a single event. In my example PickupAt(Location) would be published by a Cab, and Subscribed to by Central. Thus, for that event, Cab is the publisher, and Central is the Subscriber. In general, Who serves what role depends entirely on the system design and what events are being created. Its not something that can really be generalized, because the entire setup could be changed, or even reversed, if you setup the events differently. That I think is the most important part.

Delegates as a whole

In its simplest term, a Delegate is a Reference. It can reference a class, more commonly it can reference a method in a class, or the call to a method in a class. It can even contain an entire method call inside itself. Its really a very versatile object, in that it can do many things. In the context of events, the delegate actually references the call to the function that implements the event.

Simple Event Code

public class c1
{
    public event Eventhandler DoStuff;

    public c1()
    {

    }

    public void OnDoStuff()
    {//this actually makes the event happen
        if (DoStuff != null)
            DoStuff(this, null);
    }
}

public static void Main()
{
    c1 x = new c1();
    x.DoStuff += new EventHandler(ThingFunction);

    x.OnDoStuff();//this is how you would fire the event deliberately
}

public void ThingFunction(object sender, EventArgs x)
{
    Console.WriteLine("Something Happened");
}

c1 contains the event DoStuff, Main subscribes to this event. When the code calls x.OnDoStuff() from ANYWHERE, which is very handy if say you pass x, or a reference to it, into other classes where actual code is processed, then the handler way back in main, no matter how many layers deep the x.OnDoStuff() call originates from, will execute.

Rather more specifically, once X is created, it can be passed somewhere else. As long as some function is assigned to x.DoStuff, whenever and wherever you call the method x.OnDoStuff() from, the function that is assigned to x.DoStuff will execute. That is how event subscriptions work. x.OnDoStuff() is the code call that publishes the event x.DoStuff, and any class...in fact any number of classes, you can have multiple subscribers after all, will be able to catch the published event.

于 2012-08-08T16:21:18.893 に答える
0

「イベントドリブン」の観点から考える必要があります。この例では、taxentral と cabs の両方にパブリッシャーの役割があり、taxentral と cab にサブスクライバーの役割がある可能性があります。

たとえば、タクシーセントラルにすべてのタクシーにプッシュする更新がある場合、タクシーセントラルが発生させ、タクシーがリッスンするイベントを持つことができます。タクシーは、誰かを乗せたり降ろしたりするときにイベントを発生させることができ、タクシーセントラルはそれらすべてのイベントをリッスンします。

これは役に立ちますか?

于 2012-08-08T15:38:49.943 に答える
0

デリゲートは、メソッドを他のメソッドに送信するために使用されません。これらは、コンパイル時には不明なメソッドを呼び出すために使用されます。

簡単な例を見てみましょう。ユーザーが引数と操作を選択できる電卓を作成するとします。操作は、計算を実行するメソッドへのデリゲートにすることができます。したがって、操作の保存方法について心配する必要はありません。さらに、計算機はユーザーが提供するため、すべての操作を知る必要はありません。

デリゲートの一般的な例は、コールバック関数です。2 番目のスレッドで長期的な手順を開始する場合、スレッドが終了した場合に通知を受け取りたい場合があります。これは、プロシージャが終了したときに呼び出されるスレッドにデリゲートを提供することで実行できます。

イベントは一種の特殊なデリゲートです。これらは、オブジェクトがステータスの変更や同様のアクションを他のユーザーに通知したい場合に使用されます。これに関する特別な点は、どのオブジェクトが変更に関心があるかをオブジェクト自体が知る必要がないことです。代わりに、これらのオブジェクトはイベントにサブスクライブします。イベントを提供するオブジェクトは、イベントのデリゲートを呼び出すだけでよく、すべてのサブスクライバー デリゲートが呼び出されます。

Justin C が既に説明したように、タクシー セントラルとタクシーの両方がサブスクライバーおよびパブリッシャーとして機能します。誰が何に興味を持っているかによります。そして、全員がイベントへのサブスクライブを許可されている場合。タクシー セントラルのみが情報を取得できる場合は、コールバック メソッドが適しています。

于 2012-08-08T15:49:05.033 に答える