/// <summary>
        /// Registers a remote object
        /// </summary>
        /// <returns>An awaitable task.</returns>
        /// <param name="item">The remote item.</param>
        public async Task <bool> RegisterRemoteObjectAsync(long id, IRemoteInstance item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            using (await m_lock.LockAsync())
            {
                if (m_remoteHandles.TryGetValue(id, out var tmp))
                {
                    if (tmp != item)
                    {
                        throw new InvalidOperationException("Attempted to register handle with new instance");
                    }
                    return(false);
                }

                if (m_remoteObjects.TryGetValue(item, out var tmpid) && tmpid != id)
                {
                    throw new InvalidOperationException("Attempted to register handle with new instance");
                }

                m_remoteHandles[id]   = item;
                m_remoteObjects[item] = id;
                return(true);
            }
        }
        /// <summary>
        /// Attempts to get the handle for the local object
        /// </summary>
        /// <returns><c>true</c>, if get local handle was obtained, <c>false</c> otherwise.</returns>
        /// <param name="item">The item to get the handle for.</param>
        /// <param name="id">The handle for the item.</param>
        public bool TryGetRemoteHandle(IRemoteInstance item, out long id)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            return(m_remoteObjects.TryGetValue(item, out id));
        }
        /// <summary>
        /// Gets the handle for a remote object
        /// </summary>
        /// <returns>The remote object handle.</returns>
        /// <param name="item">The object to get the handle for.</param>
        public long GetRemoteHandle(IRemoteInstance item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            return(m_remoteObjects[item]);
        }
        /// <summary>
        /// Checks if an object is a remote handle
        /// </summary>
        /// <returns><c>true</c>, if the item is registered as a remote item, <c>false</c> otherwise.</returns>
        /// <param name="item">Item.</param>
        public bool IsRemoteObject(IRemoteInstance item)
        {
            if (item == null)
            {
                return(false);
            }

            return(m_remoteObjects.ContainsKey(item));
        }
 /// <summary>
 /// Attempts to get the local object with the given handle
 /// </summary>
 /// <returns><c>true</c>, if get remote object was found, <c>false</c> otherwise.</returns>
 /// <param name="id">The handle for the remote object.</param>
 /// <param name="item">The remote object instance.</param>
 public bool TryGetRemoteObject(long id, out IRemoteInstance item)
 {
     return(m_remoteHandles.TryGetValue(id, out item));
 }