Ejemplo n.º 1
0
        /// <summary>
        ///   Create a Proxy Object for ROS Service
        /// </summary>
        /// <typeparam name="TService"> Service Type </typeparam>
        /// <param name="serviceName"> Service Name </param>
        /// <returns> Proxy Object </returns>
        public Task <TService> ServiceProxyAsync <TService>(string serviceName)
            where TService : IService, new()
        {
            if (_disposed)
            {
                throw new ObjectDisposedException("Node");
            }
            if (_serviceProxies.ContainsKey(serviceName))
            {
                throw new InvalidOperationException(serviceName + " is already created.");
            }

            _logger.InfoFormat("Create ServiceProxy: {0}", serviceName);

            var tcs = new TaskCompletionSource <TService>();

            _masterClient
            .LookupServiceAsync(NodeId, serviceName)
            .ContinueWith(lookupTask =>
            {
                _logger.Debug("Registered Subscriber");

                if (lookupTask.Status == TaskStatus.RanToCompletion)
                {
                    _serviceProxyFactory.CreateAsync <TService>(serviceName, lookupTask.Result)
                    .ContinueWith(createTask =>
                    {
                        if (createTask.Status == TaskStatus.RanToCompletion)
                        {
                            var proxy        = createTask.Result;
                            proxy.Disposing += DisposeProxyAsync;
                            _serviceProxies.Add(serviceName, proxy);
                            tcs.SetResult(proxy.Service);
                        }
                        else if (createTask.Status == TaskStatus.Faulted)
                        {
                            tcs.SetException(createTask.Exception.InnerException);
                        }
                    });
                }
                else if (lookupTask.Status == TaskStatus.Faulted)
                {
                    tcs.SetException(lookupTask.Exception.InnerException);
                    _logger.Error("RegisterSubscriber: Failure", lookupTask.Exception.InnerException);
                }
            });

            return(tcs.Task);
        }