public async Task CreatePoolAsync(
     string poolId, 
     string virtualMachineSize, 
     int? targetDedicated, 
     string autoScaleFormula, 
     bool communicationEnabled,
     string osFamily,
     string osVersion,
     int maxTasksPerComputeNode,
     TimeSpan? timeout,
     StartTaskOptions startTask)
 {
     await this.Service.CreatePoolAsync(poolId, virtualMachineSize, targetDedicated, autoScaleFormula, communicationEnabled, osFamily, osVersion, maxTasksPerComputeNode, timeout, startTask);
 }
 public async Task CreatePoolAsync(
     string poolId, 
     string virtualMachineSize, 
     int? targetDedicated, 
     string autoScaleFormula, 
     bool communicationEnabled,
     CloudServiceConfigurationOptions cloudServiceConfigurationOptions,
     VirtualMachineConfigurationOptions virtualMachineConfigurationOptions,
     int maxTasksPerComputeNode,
     TimeSpan? timeout,
     StartTaskOptions startTask)
 {
     await this.Service.CreatePoolAsync(
         poolId, 
         virtualMachineSize, 
         targetDedicated, 
         autoScaleFormula, 
         communicationEnabled, 
         cloudServiceConfigurationOptions, 
         virtualMachineConfigurationOptions, 
         maxTasksPerComputeNode, 
         timeout, 
         startTask);
 }
        /// <summary>
        /// Creates a pool.
        /// </summary>
        /// <returns></returns>
        public async Task CreatePoolAsync(
            string poolId, 
            string virtualMachineSize, 
            int? targetDedicated, 
            string autoScaleFormula, 
            bool communicationEnabled,
            CloudServiceConfigurationOptions cloudServiceConfigurationOptions,
            VirtualMachineConfigurationOptions virtualMachineConfigurationOptions,
            int maxTasksPerComputeNode,
            TimeSpan? timeout,
            StartTaskOptions startTask)
        {
            CloudPool unboundPool;

            if (cloudServiceConfigurationOptions != null)
            {
                unboundPool = this.Client.PoolOperations.CreatePool(
                    poolId,
                    virtualMachineSize: virtualMachineSize,
                    cloudServiceConfiguration: new CloudServiceConfiguration(cloudServiceConfigurationOptions.OSFamily, cloudServiceConfigurationOptions.OSVersion),
                    targetDedicated: targetDedicated);
            }
            else if (virtualMachineConfigurationOptions != null)
            {
                unboundPool = this.Client.PoolOperations.CreatePool(
                    poolId,
                    virtualMachineSize: virtualMachineSize,
                    virtualMachineConfiguration: new VirtualMachineConfiguration(
                        new ImageReference(
                            publisher: virtualMachineConfigurationOptions.Publisher,
                            offer: virtualMachineConfigurationOptions.Offer,
                            sku: virtualMachineConfigurationOptions.SkuId,
                            version: virtualMachineConfigurationOptions.Version),
                        virtualMachineConfigurationOptions.NodeAgentSkuId,
                        virtualMachineConfigurationOptions.EnableWindowsAutomaticUpdates.HasValue ? new WindowsConfiguration(virtualMachineConfigurationOptions.EnableWindowsAutomaticUpdates) : null),
                    targetDedicated: targetDedicated);
            }
            else
            {
                throw new ArgumentException("Must set cloudServiceConfiguration or virtualMachineConfiguration");
            }

            unboundPool.InterComputeNodeCommunicationEnabled = communicationEnabled;
            unboundPool.ResizeTimeout = timeout;
            unboundPool.MaxTasksPerComputeNode = maxTasksPerComputeNode;
                
            if (!string.IsNullOrEmpty(autoScaleFormula))
            {
                unboundPool.AutoScaleEnabled = true;
                unboundPool.AutoScaleFormula = autoScaleFormula;
            }

            if (startTask != null)
            {
                unboundPool.StartTask = new StartTask
                {
                    CommandLine = startTask.CommandLine,
                    RunElevated = startTask.RunElevated,
                    ResourceFiles = startTask.ResourceFiles.ConvertAll(f => new ResourceFile(f.BlobSource, f.FilePath)),
                    WaitForSuccess = true,
                };
            }

            await unboundPool.CommitAsync();
        }
        /// <summary>
        /// Creates a pool.
        /// </summary>
        /// <param name="poolId"></param>
        /// <param name="virtualMachineSize"></param>
        /// <param name="targetDedicated"></param>
        /// <param name="autoScaleFormula"></param>
        /// <param name="communicationEnabled"></param>
        /// <param name="osFamily"></param>
        /// <param name="osVersion"></param>
        /// <param name="maxTasksPerComputeNode"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        public async Task CreatePoolAsync(
            string poolId, 
            string virtualMachineSize, 
            int? targetDedicated, 
            string autoScaleFormula, 
            bool communicationEnabled,
            string osFamily,
            string osVersion,
            int maxTasksPerComputeNode,
            TimeSpan? timeout,
            StartTaskOptions startTask)
        {
            CloudPool unboundPool = this.Client.PoolOperations.CreatePool(
                poolId, 
                osFamily: osFamily, 
                virtualMachineSize: virtualMachineSize, 
                targetDedicated: targetDedicated);
                    
            unboundPool.TargetOSVersion = osVersion;
            unboundPool.InterComputeNodeCommunicationEnabled = communicationEnabled;
            unboundPool.ResizeTimeout = timeout;
            unboundPool.MaxTasksPerComputeNode = maxTasksPerComputeNode;
                
            if (!string.IsNullOrEmpty(autoScaleFormula))
            {
                unboundPool.AutoScaleEnabled = true;
                unboundPool.AutoScaleFormula = autoScaleFormula;
            }

            if (startTask != null)
            {
                unboundPool.StartTask = new StartTask
                {
                    CommandLine = startTask.CommandLine,
                    RunElevated = startTask.RunElevated,
                    ResourceFiles = startTask.ResourceFiles.ConvertAll(f => new ResourceFile(f.BlobSource, f.FilePath)),
                    WaitForSuccess = true,
                };
            }

            await unboundPool.CommitAsync();
        }