Ejemplo n.º 1
0
        private void Prepare()
        {
            try
            {
                CheckDisposed();
                _remoteViewClient = _remoteEngineContext.ViewProcessor.CreateClient();
                CheckDisposed();

                var eventViewResultListener = new EventViewResultListener();
                eventViewResultListener.CycleCompleted += (sender, e) => Update(e.FullResult);
                eventViewResultListener.ViewDefinitionCompilationFailed += (sender, e) => SetError(e.Exception);
                eventViewResultListener.ViewDefinitionCompiled          += delegate
                {
                    _graphsOutOfDate = true;
                };
                eventViewResultListener.CycleExecutionFailed += (sender, e) => SetError(e.Exception);
                _remoteViewClient.SetResultListener(eventViewResultListener);
                _remoteViewClient.SetViewCycleAccessSupported(true);

                CheckDisposed();
                AttachToViewProcess(_remoteViewClient);
            }
            catch (Exception ex)
            {
                SetError(ex);
            }
        }
        public static IEnumerable <CycleCompletedArgs> GetCycles(this RemoteViewClient client, Action <RemoteViewClient> attachAction)
        {
            using (var resultQueue = new BlockingCollection <object>(new ConcurrentQueue <object>()))
                using (var otherQueue = new BlockingCollection <object>(new ConcurrentQueue <object>()))
                {
                    var resultListener = new EventViewResultListener();
                    resultListener.CycleCompleted += (sender, e) => resultQueue.Add(e);

                    resultListener.CycleExecutionFailed            += (s, e) => otherQueue.Add(e);
                    resultListener.ProcessTerminated               += (s, e) => otherQueue.Add(e);
                    resultListener.ViewDefinitionCompilationFailed += (s, e) => otherQueue.Add(e);

                    client.SetResultListener(resultListener);

                    attachAction(client);

                    TimeSpan timeout = TimeSpan.FromMinutes(1);

                    try
                    {
                        while (true)
                        {
                            object next;
                            var    index = BlockingCollection <object> .TryTakeFromAny(new[] { resultQueue, otherQueue }, out next, timeout);

                            if (index == 0)
                            {
                                yield return((CycleCompletedArgs)next);
                            }
                            else
                            {
                                var detailMessage = string.Format("for {0} after {1}\n state {2} is completed {3}", client.GetViewDefinition().Name, timeout, client.GetState(), client.IsCompleted);
                                switch (index)
                                {
                                case 0:
                                    throw new ArgumentException("index");

                                case 1:
                                    throw new Exception(string.Format("Error occured whilst getting results {0}\n{1}", next, detailMessage));

                                default:

                                    throw new TimeoutException("No results received " + detailMessage);
                                }
                            }
                        }
                    }
                    finally
                    {
                        client.RemoveResultListener();
                    }
                }
        }