1

私はRx(リアクティブエクステンション)を学んでいるので、与えられた2つのコードの違いを知りたいです:

コード1

static void Main(string[] args)
{
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Logs", "*.*");
            watcher.EnableRaisingEvents = true;


            var source = Observable.FromEvent<FileSystemEventHandler, FileSystemEventArgs>(handler =>
                {
                    FileSystemEventHandler fsHandler = (sender, e) =>
                        {
                            handler(e);
                        };
                    return fsHandler;
                },

                fsHandler => watcher.Created += fsHandler,

                fsHandler => watcher.Created -= fsHandler
                    );

            source.Subscribe(x => Console.WriteLine(x.Name + "is created"));

            Console.Read();
}

コード2

static void Main(string[] args)
        {

            FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Logs", "*.*");
            watcher.EnableRaisingEvents = true;

            watcher.Created += watcher_Created;

            Console.Read();
        }


        static void watcher_Created(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine(e.Name.ToString());
        }

同じ結果が得られるため、上記の2つのコードの違いは何ですか?

コア部分を調べて、両方のコード行が別々のスレッドで実行されることを発見した場合でも、これらの違いと、そのようなシナリオでRxを使用する理由は何ですか?

前もって感謝します!

4

1 に答える 1

1

この特定の例では、Rx を使用することには 2 つの潜在的な利点があります (潜在的な強調):

  • イベント ハンドラーを「配線解除」する便利な方法:Disposeサブスクリプション (呼び出しによって返されるものSubscribe) を呼び出すと、次の場合と同じ効果があります。watcher.Created -= handler

  • このソースからのイベントを他の(さらに言えば ) ソースで構成する方法。たとえば、ユース ケースが「ファイルがいつ作成され、次に 3 回書き込まれるかなどを知る必要がある」場合、 で公開されているさまざまなイベントから複数の「ウォッチャー」を作成し、次のクエリを作成できます。正しい条件が発生した場合にのみ発火しますIObservableIEnumerableIObservableFileSystemWatcher

疑似 LINQ で:

var createEvents = <get created event handler>;
var changeEvents = <get changed event handler>;
var createThenChangeThenChangeThenChange = 
    from create in createEvents
    where create.Name == "some file I care about"
    from firstChange in changeEvents
    from secondChange in changeEvents
    from thirdChange in changeEvents
    select new { create, firstChange, secondChange, thirdChange};
于 2013-02-14T16:41:40.217 に答える