// Executes the asynchronous method with load balancing in case of virtual network
        internal TResult ExecuteAndGetWithVirtualNetworkLoadBalancing <TResult>(Func <string, Task <TResult> > method)
        {
            if (_loadBalancer == null)
            {
                return(method.Invoke(null).Result);
            }
            else
            {
                TResult result = default(TResult);

                int numRetries = _loadBalancer.GetNumAvailableEndpoints();
                LoadBalancingHelper.Execute(() =>
                {
                    var endpoint = _loadBalancer.GetEndpoint();
                    Contract.Assert(endpoint != null, "Load balancer failed to return a worker node endpoint!");

                    Trace.TraceInformation("\tIssuing request to endpoint " + endpoint);
                    try
                    {
                        result = method.Invoke(endpoint.ToString()).Result;
                        _loadBalancer.RecordSuccess(endpoint);
                    }
                    catch (Exception)
                    {
                        _loadBalancer.RecordFailure(endpoint);
                        throw;
                    }
                },
                                            new RetryOnAllExceptionsPolicy(),
                                            new NoOpBackOffScheme(), numRetries: numRetries);

                return(result);
            }
        }