示例#1
0
        void RegisterCaches()
        {
            _cacheScheduler = TaskPoolScheduler.Default;

            Container.RegisterInitializer <IBlobCache>(RegisterCache);
            RegisterMemoryCaches();
            RegisterLocalCaches();
            RegisterRoamingCaches();
        }
示例#2
0
        public RxSocket(ISocket socket, IParser parser, IMessageFormatter <TPayload> formatter)
        {
            _socket    = socket;
            _parser    = parser;
            _formatter = formatter;

            _socket.WhenMessageParsed.Subscribe(bytes => _formatter.FormatMessageAsync(bytes));
            _whenMessageReceived = new Subject <TPayload>();
            _whenMessageSent     = new Subject <TPayload>();
            _factoryScheduler    = new TaskPoolScheduler(Task.Factory);
            _formatter.WhenNewMessage.Subscribe(message => _whenMessageReceived.OnNext(message));
        }
示例#3
0
        public async Task Listen(IByteReceiver byteReceiver,
                                 IStreamFactory streamFactory,
                                 string destinationPath = "",
                                 CancellationToken cancellationToken = default)
        {
            var observableScheduler =
                new TaskPoolScheduler(new TaskFactory(cancellationToken)); //Scheduler.Default; //

            await Listen(byteReceiver,
                         streamFactory,
                         observableScheduler,
                         destinationPath,
                         cancellationToken).ConfigureAwait(false);
        }
        /**
         * Scheduler控制订阅和通知的发送。
         * Scheduler包含三个组件:1)一个优先队列存放任务,2)Execution context,用来决定任务在哪执行(线程池,当前线程)3)scheduler的时钟,Task是根据这个时钟调度的,不是系统时钟。
         *
         * rx中所有的Scheduler实现IScheduler接口。
         *
         */

        public static void GetSchedulers()
        {
            //立刻在当前线程上执行
            ImmediateScheduler immediate = Scheduler.Immediate;
            //在当前线程上尽可能快的执行(先放到队列中,尽快执行)
            CurrentThreadScheduler currentThreadScheduler = Scheduler.CurrentThread;
            //每次创建一个线程执行
            NewThreadScheduler newThreadScheduler = NewThreadScheduler.Default;
            //在Task Factory上执行
            TaskPoolScheduler taskPoolScheduler = TaskPoolScheduler.Default;

            //在当前Dispatcher上执行任务
            DispatcherScheduler dispatcherScheduler = DispatcherScheduler.Current;

            //在ThreadPool上执行
            ThreadPoolScheduler threadPoolScheduler = ThreadPoolScheduler.Instance;
            //默认的调度器  其原则是使用最小的并行性,for operators returning an observable with a finite and small number of messages, Rx calls Immediate.  For operators returning a potentially large or infinite number of messages, CurrentThread is called. For operators which use timers, ThreadPool is used.
            DefaultScheduler defaultScheduler = Scheduler.Default;
        }
示例#5
0
        /// <summary>
        /// The pump for received messages.
        /// </summary>
        /// <param name="uri">
        /// The uri.
        /// </param>
        /// <param name="cancellation">
        /// The cancellation token source.
        /// </param>
        /// <returns>
        /// The observable stream of messages.
        /// </returns>
        private static IObservableSocket CreateObservableSocket(Uri uri, CancellationTokenSource cancellation)
        {
            var status               = new ReplaySubject <ConnectionStatus>(1);
            var socket               = new WebSocket4Net.WebSocket(uri.ToString());
            var connected            = new TaskCompletionSource <int>();
            var dispatcher           = new ConcurrentExclusiveSchedulerPair();
            var sendScheduler        = new TaskPoolScheduler(new TaskFactory(dispatcher.ExclusiveScheduler));
            var receiveScheduler     = new TaskPoolScheduler(new TaskFactory(dispatcher.ConcurrentScheduler));
            Func <string, Task> send = message =>
            {
                var tcs = new TaskCompletionSource <int>();
                sendScheduler.Schedule(
                    () =>
                {
                    try
                    {
                        if (socket.State != WebSocket4Net.WebSocketState.Open)
                        {
                            socket.Open();
                        }

                        socket.Send(message);
                        tcs.SetResult(0);
                    }
                    catch (Exception e)
                    {
                        tcs.SetException(e);
                    }
                });
                ;

                return(tcs.Task);
            };

            socket.Open();
            var incoming = Observable.Create <string>(
                observer =>
            {
                status.OnNext(ConnectionStatus.Connecting);
                var completed = false;
                EventHandler <WebSocket4Net.MessageReceivedEventArgs> onMessage    = (sender, args) => observer.OnNext(args.Message);
                EventHandler <ws::SuperSocket.ClientEngine.ErrorEventArgs> onError = (sender, args) =>
                {
                    observer.OnError(args.Exception);
                    completed = true;
                    cancellation.Cancel();
                };
                EventHandler onClosed = (sender, args) => cancellation.Cancel();

                socket.MessageReceived += onMessage;
                socket.Error           += onError;
                socket.Closed          += onClosed;
                socket.Opened          += (sender, args) => connected.TrySetResult(0);
                cancellation.Token.Register(
                    () =>
                {
                    if (!completed)
                    {
                        observer.OnCompleted();
                    }

                    socket.MessageReceived -= onMessage;
                    socket.Error           -= onError;
                    socket.Closed          -= onClosed;
                    try
                    {
                        socket.Close();
                    }
                    catch
                    {
                        // Ignore errors closing the socket.
                    }

                    dispatcher.Complete();
                });

                return(Disposable.Create(cancellation.Cancel));
            }).SubscribeOn(receiveScheduler).Publish().RefCount();

            return(new ObservableSocket(incoming, send, status, connected.Task));
        }