1

オブザーバー パターンとデリゲートを理解しようとする助けが必要です。このコードを別の Web サイトで見つけたので、実際に何をしているのかを理解しようとしています。誰か助けてくれませんか。

コードを実行すると、"Server is up and running" と "Server is down, We are working on it it will be back soon" の両方のメッセージが表示されます。Main には server.ServerStatus = true; があるため、両方のメッセージを受け取っていると思います。および server.ServerStatus = false です。ただし、server.ServerStatus = true; をコメントアウトすると、実行すると、「サーバーは稼働中です」というメッセージが表示されますが、「サーバーがダウンしています。まもなく復旧します。」というメッセージしか表示されないと予想していました。誰か説明できますか?スーザン

class Program
{
    static void Main(string[] args)
    {
        Server server = new Server();
        server.ServerStatusChanged += new EventHandler(ProcessServerStatus);
        server.ServerStatus = true; 
        server.ServerStatus = false;
        Console.Read();
    }


    public class Server
    {
        public event EventHandler ServerStatusChanged;
        private bool _ServerStatus;

        public bool ServerStatus
        {
            get { return this._ServerStatus; }
            set {
                if (this._ServerStatus == value) return; // Dont need to do anything;
                if (this.ServerStatusChanged != null) // make sure the invocation list is not empty  
                    ServerStatusChanged(value, new EventArgs());  // Firing Event
                this._ServerStatus = value; 
            } 
        }
    }



    public static void ProcessServerStatus(object sender, EventArgs e)
    {
        bool status = (bool)sender; 
        if (status)
            Console.WriteLine("Server is up and running");
        else
            Console.WriteLine("Server is down, We are working on it it will be back soon");

    }



}
4

4 に答える 4

2

これがあなたが望むことをするコードです。

_initialized 変数に注意してください。そうしないと最初から何も起こらないので、これが必要です。正しく機能する前に、ステータスを True に設定する必要があります。

また、あなたが説明したことは私には起こりませんでした。稼働中であるというメッセージを受け取りませんでした。何も得られませんでした。

    class Program
{
    static void Main(string[] args)
    {
        Server server = new Server(); 
        server.ServerStatusChanged += new EventHandler(ProcessServerStatus); 
        //server.ServerStatus = true; 
        server.ServerStatus = false; 
        Console.Read();
    }

    public class Server
    {
        public event EventHandler ServerStatusChanged; 
        private bool _ServerStatus = false;
        private bool _initialized = false;
        public bool ServerStatus
        {
            get { return this._ServerStatus; }
            set
            {
                if (this._initialized == true && this._ServerStatus == value)
                    return; // Dont need to do anything;                
                else
                    this._initialized = true;
                if (this.ServerStatusChanged != null) // make sure the invocation list is not empty                      
                    ServerStatusChanged(value, new EventArgs());  // Firing Event                
                this._ServerStatus = value;
            }
        }
    }
    public static void ProcessServerStatus(object sender, EventArgs e)
    {
        bool status = (bool)sender;
        if (status)
            Console.WriteLine("Server is up and running");
        else Console.WriteLine("Server is down, We are working on it it will be back soon");
    }
}
于 2009-04-22T00:05:33.400 に答える
0

これまで Observer パターンに出くわしたことがない場合は、すべてのメソッド呼び出しが非常に静的に行われると考えるのが本能的かもしれません。コードで呼び出すメソッドは、呼び出されるものです。ただし、オブザーバー パターンを使用すると、より動的に処理できます。実行時に何かを言うことができます。そのようなことが起こったら、私に知らせてください」-そして、それが起こったとき、それはまさにそれを行います-彼ら全員に知らせます. これは、呼び出す必要があるメソッドのリストを保持し、イベントが「トリガー」されたときにそれらすべてを呼び出すことによって行われます。

この線:

server.ServerStatusChanged += new EventHandler(ProcessServerStatus);

サーバーオブジェクトに「サーバーのステータスが変わったら教えてください。ProcessServerStatusメソッドを呼び出すことで知らせてください」と伝えています。そして、次の行の場合:

server.ServerStatus = true;

が実行されると、ServerStatusChanged イベントがトリガーされ、「お知らせください」と言ったすべてのイベントが呼び出されます。ProcessServerStatusそれがリスト内の唯一のメソッドであるため、メソッドを呼び出します。

そのリストにあるすべてのメソッドには、特定のメソッド シグネチャが必要です。この場合、void ProcessServerStatus(object sender, EventArgs e). この場合のsenderパラメーターはサーバーのステータスです。これは次の行で確認できます。

ServerStatusChanged(value, new EventArgs());

ProcessServerStatus呼び出されると、それをブール値にキャストし、適切な文字列を出力します。

このコードを実行すると、期待どおりに動作します。serverStatus = true;行をコメントアウトすると、何も出力されません (_serverStatus のデフォルトは false であり、ステータスが変更されていない場合、イベントはトリガーされないため)。代わりに、行をコメントアウトするserverStatus = false;と、「サーバーは稼働中です」と表示されます

于 2009-04-22T00:08:57.823 に答える
0

基本的に発生しているのは、ServerStatus を true/false に設定している Main の割り当てが、ServerStatus プロパティの "set" 関数を呼び出すことです。

その関数内で、イベントが作成され、ServerStatusChanged ハンドラーに対して起動されます。これは、イベントに登録したすべてのユーザーが受け取ります。また、ステータスが変化した場合にのみイベントが発生することにも注意してください。

この場合、Main は

Server.ServerStatusChanged += new EventHandler(ProcessServerStatus);

ライン。

ServerStatus を true に設定してから Main で false に設定すると、2 つのイベントが発生し、コンソールに「サーバーは稼働中です」と「サーバーが停止しています。作業中です....」の両方が表示されます。

于 2009-04-21T23:57:12.843 に答える
0

これはイベント登録...

server.ServerStatusChanged += new EventHandler(ProcessServerStatus);

「ServerStatusChanged があるときはいつでも、ProcesServerStatus メソッドを呼び出してください」と書かれています。そのため、ServerStatus を true に設定すると、ProcessServerStatus への呼び出しに true が渡され、"Server is up..." が出力されます。falseに変更すると別のイベントが発火するのですが、今回はServerStatusがfalseなので「Server is down...」と出てしまうので、サーバーの状態を見て、変化したら何か(ProcessServerStatus)をしているということです。

于 2009-04-21T23:56:34.467 に答える