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(); } } }