| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | using System;using System.Drawing;using System.Messaging;using System.Reactive.Concurrency;using System.Reactive.Disposables;using System.Reactive.Linq;namespace RxMouseClient{    partial class Program    {        static IObservable<Point> Msmq(string srv)        {            return FromQueue<Point>(srv + "\\Private$\\MouseService");        }        static IObservable<T> FromQueue<T>(string serverQueue)        {            return Observable.Create<T>(observer =>            {                var responseQueue = Environment.MachineName + "\\Private$\\" + Guid.NewGuid().ToString();                var queue = MessageQueue.Create(responseQueue);                var frm = new System.Messaging.BinaryMessageFormatter();                var srv = new MessageQueue(serverQueue);                srv.Formatter = frm;                queue.Formatter = frm;                srv.Send("S " + responseQueue);                var loop = NewThreadScheduler.Default.ScheduleLongRunning(cancel =>                {                    while (!cancel.IsDisposed)                    {                        var msg = queue.Receive();                        observer.OnNext((T)msg.Body);                    }                });                return new CompositeDisposable(                    loop,                    Disposable.Create(() =>                    {                        srv.Send("D " + responseQueue);                        MessageQueue.Delete(responseQueue);                    })                );            });        }    }}
 |