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