예제 #1
0
        Task <T> ExecuteAsync(Task <T> task, Func <T, Task <T> > continuationTask, ExecuteOptions options)
        {
            var source = new TaskCompletionSource <Task <T> >();

            task.ContinueWith((Task <T> innerTask) =>
            {
                if (innerTask.IsFaulted)
                {
                    source.TrySetException(innerTask.Exception.InnerExceptions);
                }
                else if (innerTask.IsCanceled || _cancellationToken.IsCancellationRequested)
                {
                    source.TrySetCanceled();
                }
                else
                {
                    try
                    {
                        source.TrySetResult(continuationTask(innerTask.Result));
                    }
                    catch (Exception ex)
                    {
                        source.TrySetException(ex);
                    }
                }
            }, options.HasFlag(ExecuteOptions.RunSynchronously)
                ? TaskContinuationOptions.ExecuteSynchronously
                : TaskContinuationOptions.None);

            return(source.Task.FastUnwrap());
        }
예제 #2
0
        Task <T> Execute(Task <T> task, Func <T, Task <T> > continuationTask, ExecuteOptions options)
        {
            if (task.IsCompleted && options.HasFlag(ExecuteOptions.RunSynchronously))
            {
                if (task.IsFaulted)
                {
                    return(TaskUtil.Faulted <T>(task.Exception.InnerExceptions));
                }

                if (task.IsCanceled || _cancellationToken.IsCancellationRequested)
                {
                    return(TaskUtil.Canceled <T>());
                }

                if (task.Status == TaskStatus.RanToCompletion)
                {
                    try
                    {
                        return(continuationTask(task.Result));
                    }
                    catch (Exception ex)
                    {
                        return(TaskUtil.Faulted <T>(ex));
                    }
                }
            }

            return(ExecuteAsync(task, continuationTask, options));
        }
예제 #3
0
 /// <summary>
 /// ExecuteOnChannel method implementation
 /// </summary>
 private void ExecuteOnSpecificChannel(string operationName, string uri, ExecuteOptions options, CodeToRunOnChannel codeBlock)
 {
     using (new SPMonitoredScope("ExecuteSpecificChannel:" + operationName))
     {
         try
         {
             string ep = FindLoadBalancerEndPoint(uri);
             if (!string.IsNullOrEmpty(ep))
             {
                 Uri      xu      = new Uri(ep);
                 IChannel channel = (IChannel)GetChannel(xu, options);
                 try
                 {
                     codeBlock((IIdentityServiceContract)channel);
                     channel.Close();
                 }
                 finally
                 {
                     if (channel.State != CommunicationState.Closed)
                     {
                         channel.Abort();
                     }
                 }
             }
         }
         finally
         {
         }
     }
 }
예제 #4
0
        /// <summary>
        /// GetChannel method implementation
        /// </summary>
        private IIdentityServiceContract GetChannel(Uri address, ExecuteOptions options)
        {
            string endpointConfigurationName = GetEndpointConfigurationName(address);

            if ((null == m_ChannelFactory) || (endpointConfigurationName != m_EndpointConfigurationName))
            {
                lock (m_ChannelFactoryLock)
                {
                    if ((null == m_ChannelFactory) || (endpointConfigurationName != m_EndpointConfigurationName))
                    {
                        m_ChannelFactory            = CreateChannelFactory <IIdentityServiceContract>(endpointConfigurationName);
                        m_EndpointConfigurationName = endpointConfigurationName;
                    }
                }
            }
            IIdentityServiceContract channel;

            if (ExecuteOptions.AsProcess == (options & ExecuteOptions.AsProcess))
            {
                channel = m_ChannelFactory.CreateChannelAsProcess <IIdentityServiceContract>(new EndpointAddress(address));
            }
            else
            {
                channel = m_ChannelFactory.CreateChannelActingAsLoggedOnUser <IIdentityServiceContract>(new EndpointAddress(address));
            }
            return(channel);
        }
예제 #5
0
        private static int Run(ExecuteOptions options)
        {
            PopulateMissingConfigValues(ref options);
            var app = DependencyRegistry.GetApplication(options);

            return(app.Run(options));
        }
예제 #6
0
 /// <summary>
 /// Invoke method implementation
 /// </summary>
 private T Invoke <T>(string operationName, string uri, ExecuteOptions options, InvokeDelegate <T> operation)
 {
     using (new SPMonitoredScope("Invoke :" + operationName + "_" + uri))
     {
         string ep = FindLoadBalancerEndPoint(uri);
         if (!string.IsNullOrEmpty(ep))
         {
             Uri xu = new Uri(ep);
             IIdentityServiceContract identityapplication = GetChannel(xu, options);
             IClientChannel           clientChannel       = identityapplication as IClientChannel;
             try
             {
                 operation(identityapplication);
                 clientChannel.Close();
             }
             finally
             {
                 if (clientChannel.State != CommunicationState.Closed)
                 {
                     clientChannel.Abort();
                 }
             }
         }
     }
     return(default(T));
 }
예제 #7
0
 public static Task <TResponse> ExecuteAsync <TRequest, TResponse>(this IClient client, TRequest request,
                                                                   ExecuteOptions settings)
     where TRequest : ClientRequest
     where TResponse : IResponse
 {
     return(client.ExecuteAsync <TRequest, TResponse>(request, settings, CancellationToken.None));
 }
예제 #8
0
        /// <summary>
        /// ExecuteOnChannel method implementation
        /// </summary>
        private void ExecuteOnChannel(string operationName, ExecuteOptions options, CodeToRunOnChannel codeBlock)
        {
            using (new SPMonitoredScope("ExecuteOnChannel:" + operationName))
            {
                bool   mustexit     = false;
                string firstaddress = "";
                do
                {
                    SPServiceLoadBalancerContext loadBalancerContext = m_LoadBalancer.BeginOperation();
                    try
                    {
                        if (firstaddress.Equals(loadBalancerContext.EndpointAddress.ToString()))
                        {
                            mustexit = true;
                        }
                        if (!mustexit)
                        {
                            if ((loadBalancerContext.Status == SPServiceLoadBalancerStatus.Succeeded))
                            {
                                if (string.IsNullOrEmpty(firstaddress))
                                {
                                    firstaddress = loadBalancerContext.EndpointAddress.ToString();
                                }

                                IChannel channel = (IChannel)GetChannel(loadBalancerContext.EndpointAddress, options);
                                try
                                {
                                    codeBlock((IIdentityServiceContract)channel);
                                    channel.Close();
                                    mustexit = true;
                                }
                                catch (TimeoutException)
                                {
                                    loadBalancerContext.Status = SPServiceLoadBalancerStatus.Failed;
                                }
                                catch (EndpointNotFoundException)
                                {
                                    loadBalancerContext.Status = SPServiceLoadBalancerStatus.Failed;
                                }
                                finally
                                {
                                    if (channel.State != CommunicationState.Closed)
                                    {
                                        channel.Abort();
                                    }
                                }
                            }
                        }
                    }
                    finally
                    {
                        loadBalancerContext.EndOperation();
                    }
                }while (!mustexit);
            }
        }
        protected static int RunExecuteAndReturnExitCode(ExecuteOptions opts, ITelemetryLogger telemetryLogger, PlatformSpecificServices AddPlatformSpecificServices, EngineEntryPoint StartEngine)
        {
            telemetryLogger.TrackEvent("ExecuteCommand");

            if (opts.ConfigFile == string.Empty)
            {
                opts.ConfigFile = "configuration.json";
            }

            if (!File.Exists(opts.ConfigFile))
            {
                Log.Information("The config file {ConfigFile} does not exist, nor does the default 'configuration.json'. Use '{ExecutableName}.exe init' to create a configuration file first", opts.ConfigFile, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
                return(1);
            }
            Log.Information("Config Found, creating engine host");
            var config = new EngineConfigurationBuilder().BuildFromFile(opts.ConfigFile);

            Console.Title = $"Azure DevOps Migration Tools: {System.IO.Path.GetFileName(opts.ConfigFile)} - {System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(3)} - {config.Source.Project} - {config.Target.Project}";
            // Setup Host
            var host = Host.CreateDefaultBuilder()
                       .ConfigureHostConfiguration(configHost =>
            {
                configHost.SetBasePath(Directory.GetCurrentDirectory());
                configHost.AddJsonFile("appsettings.json", optional: true);
                configHost.AddEnvironmentVariables();
            })
                       .ConfigureAppConfiguration((hostContext, configApp) =>
            {
                configApp.SetBasePath(Directory.GetCurrentDirectory());
                configApp.AddJsonFile(opts.ConfigFile, optional: false);
                configApp.AddJsonFile(
                    $"{opts.ConfigFile}.{hostContext.HostingEnvironment.EnvironmentName}.json",
                    optional: true);
            })
                       .ConfigureServices((context, services) =>
            {
                services.AddOptions();
                services.AddSingleton <IDetectOnlineService, DetectOnlineService>();
                services.AddSingleton <IDetectVersionService, DetectVersionService>();
                services.AddSingleton <ITelemetryLogger>(telemetryLogger);
                services.AddSingleton <IEngineConfigurationBuilder, EngineConfigurationBuilder>();
                services.AddSingleton <EngineConfiguration>(config);
                services.AddSingleton <ProcessorContainer>();
                services.AddSingleton <TypeDefinitionMapContainer>();
                services.AddSingleton <GitRepoMapContainer>();
                services.AddSingleton <ChangeSetMappingContainer>();
                AddPlatformSpecificServices(services);
            })
                       .UseConsoleLifetime()
                       .UseSerilog()
                       .Build();

            StartEngine(host, opts);
            Log.Information("Run complete...");
            return(0);
        }
예제 #10
0
        /// <summary>
        ///     Execute an taskFactory with the specified payload.
        /// </summary>
        /// <param name="composer">The source composer</param>
        /// <param name="taskFactory">The taskFactory to execute</param>
        /// <param name="options">The task execution options</param>
        /// <returns></returns>
        public static Composer <T> ExecuteAsync <T>(this Composer <T> composer, Func <T, CancellationToken, Task> taskFactory,
                                                    ExecuteOptions options = ExecuteOptions.None)
        {
            return(composer.ExecuteAsync(async(payload, token) =>
            {
                await taskFactory(payload, token);

                return payload;
            }, options));
        }
예제 #11
0
        Composer Composer.ExecuteAsync(Func <CancellationToken, Task> taskFactory, ExecuteOptions options)
        {
            _composer.ExecuteAsync(async(x, token) =>
            {
                await taskFactory(token);

                return(x);
            }, options);

            return(this);
        }
예제 #12
0
        Composer <T> Composer <T> .Finally(Action <T, TaskStatus> continuation, ExecuteOptions options)
        {
            if (_task.IsCompleted && options.HasFlag(ExecuteOptions.RunSynchronously))
            {
                continuation(_payload, _task.Status);
                return(this);
            }

            _task = FinallyAsync(_task, continuation, options);
            return(this);
        }
예제 #13
0
 public ExecuteHostedService(
     ExecuteOptions exceuteOptions,
     IMigrationEngine migrationEngine,
     ILogger <ExecuteHostedService> logger,
     IHostApplicationLifetime appLifetime)
 {
     _exceuteOptions  = exceuteOptions;
     _migrationEngine = migrationEngine;
     _logger          = logger;
     _appLifetime     = appLifetime;
 }
예제 #14
0
 public ExecuteHostedService(
     IServiceProvider services,
     ExecuteOptions exceuteOptions,
     ILogger <ExecuteHostedService> logger,
     IHostApplicationLifetime appLifetime)
 {
     _exceuteOptions = exceuteOptions;
     _services       = services;
     _logger         = logger;
     _appLifetime    = appLifetime;
 }
예제 #15
0
        /// <inheritdoc/>
        public async Task <object> ExecuteAsync(object request, ExecuteOptions settings, CancellationToken cancellationToken)
        {
            if (request is HttpRequest httpRequest)
            {
                var requestMessage = CreateHttpRequestMessage(httpRequest);

                var responseMessage = await HttpClient.SendAsync(requestMessage, cancellationToken);

                return(new HttpResponse(responseMessage));
            }

            throw new ArgumentException($"request type not {typeof(HttpRequest)}.", nameof(request));
        }
		private static IExecute GetServiceFromOption(ExecuteOptions option) {
			var list = new Dictionary<ExecuteOptions, IExecute>
			{
				{ExecuteOptions.ListVerifiedEmailAddresses,new ExecuteListVerifiedEmailAddresses()},
				{ExecuteOptions.VerifyEmailAddress,new ExecuteVerifyEmailAddress()},
				{ExecuteOptions.DeleteVerifiedEmailAddress,new ExecuteDeleteVerifiedEmailAddress()},
				{ExecuteOptions.SendStatistics,new ExecuteSendStatistics()},
				{ExecuteOptions.SendQuota, new ExecuteSendQuota()},
				{ExecuteOptions.SendEmail, new ExecuteSendEmail()},
				{ExecuteOptions.SendRawEmail, new ExecuteSendRawEmail()}
			};

			return list.ContainsKey(option) ? list[option] : null;
		}
예제 #17
0
        private static (InitOptions init, ExecuteOptions execute) ParseOptions(string[] args)
        {
            InitOptions    initOptions    = null;
            ExecuteOptions executeOptions = null;

            Parser.Default.ParseArguments <InitOptions, ExecuteOptions>(args)
            .WithParsed <InitOptions>(opts =>
            {
                initOptions = opts;
            })
            .WithParsed <ExecuteOptions>(opts =>
            {
                executeOptions = opts;
            });
            return(initOptions, executeOptions);
        }
예제 #18
0
 public MigrationEngine(
     ExecuteOptions executeOptions,
     EngineConfiguration config,
     TypeDefinitionMapContainer typeDefinitionMaps,
     ProcessorContainer processors,
     GitRepoMapContainer gitRepoMaps,
     ChangeSetMappingContainer changeSetMapps,
     FieldMapContainer fieldMaps,
     ITelemetryLogger telemetry)
 {
     Log.Information("Creating Migration Engine {Guid}", _Guid);
     FieldMaps           = fieldMaps;
     this.executeOptions = executeOptions;
     TypeDefinitionMaps  = typeDefinitionMaps;
     Processors          = processors;
     GitRepoMaps         = gitRepoMaps;
     ChangeSetMapps      = changeSetMapps;
     Telemetry           = telemetry;
     ProcessConfiguration(config);
 }
예제 #19
0
        public static void StartEngine(IHost host, ExecuteOptions opts)
        {
            var me = host.Services.GetRequiredService <MigrationEngineCore>();
            NetworkCredential sourceCredentials = null;
            NetworkCredential targetCredentials = null;

            if (!string.IsNullOrWhiteSpace(opts.SourceUserName) && !string.IsNullOrWhiteSpace(opts.SourcePassword))
            {
                sourceCredentials = new NetworkCredential(opts.SourceUserName, opts.SourcePassword, opts.SourceDomain);//new VssCredentials(new Microsoft.VisualStudio.Services.Common.WindowsCredential(new NetworkCredential(opts.SourceUserName, opts.SourcePassword, opts.SourceDomain)));
            }
            if (!string.IsNullOrWhiteSpace(opts.TargetUserName) && !string.IsNullOrWhiteSpace(opts.TargetPassword))
            {
                targetCredentials = new NetworkCredential(opts.TargetUserName, opts.TargetPassword, opts.TargetDomain);//new VssCredentials(new Microsoft.VisualStudio.Services.Common.WindowsCredential(new NetworkCredential(opts.TargetUserName, opts.TargetPassword, opts.TargetDomain)));
            }
            //me.AddNetworkCredentials(sourceCredentials, targetCredentials);

            Log.Information("Engine created, running...");

            me.Run();
        }
예제 #20
0
        /// <summary>
        /// 開始処理
        /// </summary>
        /// <param name="filePath"></param>
        public ExcelFormatter(string filePath, ExcelFormatterApp eApp, Config config, ExecuteOptions options, string directory)
        {
            // アプリケーションの代入
            this.ExcelApp = eApp.Application;
            // テンプレートワークブックの読み込み
            this.TemplateWorkBook = eApp.Template;
            // コンフィグファイルの読み込み
            this.Config = config;
            // 実行オプションの読み込み
            this.Options = options;

            // 更新時刻の記録
            if (!this.Options.OverWriteWriteTime)
            {
                this.CreationTime   = File.GetCreationTime(filePath);
                this.LastAccessTime = File.GetLastAccessTime(filePath);
                this.LastWriteTime  = File.GetLastWriteTime(filePath);
            }
            this.filePath  = filePath;
            this.Directory = directory;
        }
예제 #21
0
        Task <T> FinallyAsync(Task <T> task, Action <T, TaskStatus> continuation, ExecuteOptions options)
        {
            var source = new TaskCompletionSource <T>();

            task.ContinueWith((Task <T> innerTask) =>
            {
                try
                {
                    continuation(_payload, innerTask.Status);
                    source.TrySetFromTask(innerTask);
                }
                catch (Exception ex)
                {
                    source.TrySetException(ex);
                }
            }, options.HasFlag(ExecuteOptions.RunSynchronously)
                ? TaskContinuationOptions.ExecuteSynchronously
                : TaskContinuationOptions.None);

            return(source.Task);
        }
예제 #22
0
 public MigrationEngine(
     IServiceProvider services,
     ExecuteOptions executeOptions,
     EngineConfiguration config,
     TypeDefinitionMapContainer typeDefinitionMaps,
     ProcessorContainer processors,
     GitRepoMapContainer gitRepoMaps,
     ChangeSetMappingContainer changeSetMapps,
     FieldMapContainer fieldMaps,
     ITelemetryLogger telemetry)
 {
     Log.Information("Creating Migration Engine {SessionId}", telemetry.SessionId);
     _services           = services;
     FieldMaps           = fieldMaps;
     this.executeOptions = executeOptions;
     TypeDefinitionMaps  = typeDefinitionMaps;
     Processors          = processors;
     GitRepoMaps         = gitRepoMaps;
     ChangeSetMapps      = changeSetMapps;
     Telemetry           = telemetry;
     Config = config;
 }
예제 #23
0
        /// <summary>
        /// エクセルファイル群をフォーマットします。
        /// </summary>
        /// <param name="directoryList"></param>
        /// <param name="executeOptions"></param>
        /// <param name="excelApp"></param>
        private static void FormatExcelFiles(CommandArgument directoryList, ExecuteOptions executeOptions, ExcelFormatterApp excelApp)
        {
            foreach (string directory in directoryList.Values)
            {
                // ディレクトリ下のxlsxファイルをすべて取得
                DirectoryInfo di = new DirectoryInfo(directory);
                // ディレクトリ検索オプション
                SearchOption searchOption = executeOptions.SubDirectory ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
                try
                {
                    FileInfo[] files = System.Array.FindAll(di.GetFiles("*", searchOption), SearchFile);

                    Console.WriteLine("----------------------------------------");
                    LogUtil.Log("ディレクトリ[" + directory + "]内のエクセルファイルに対し処理を開始します。");
                    foreach (FileInfo file in files)
                    {
                        // エクセルファイル一つ一つに対して処理を行う
                        using (ExcelFormatter formatter = new ExcelFormatter(file.FullName, excelApp, excelApp.Config, executeOptions, directory))
                        {
                            try
                            {
                                formatter.Open();
                                formatter.Format();
                                formatter.SaveAndClose();
                            }
                            catch (Exception e)
                            {
                                LogUtil.LogWarn("[" + file + "] の処理中にエラーが発生しました。対象への処理を停止します。", e);
                            }
                        }
                    }
                }
                catch (System.IO.DirectoryNotFoundException e)
                {
                    LogUtil.LogError("[" + directory + "]は存在しないディレクトリです。対象への処理を停止します。", e);
                }
            }
        }
예제 #24
0
        public static void ExecuteEntryPoint(IHost host, ExecuteOptions opts)
        {
            var me = host.Services.GetRequiredService <Engine.MigrationEngine>();
            NetworkCredential sourceCredentials = null;
            NetworkCredential targetCredentials = null;

            if (!string.IsNullOrWhiteSpace(opts.SourceUserName) && !string.IsNullOrWhiteSpace(opts.SourcePassword))
            {
                sourceCredentials = new NetworkCredential(opts.SourceUserName, opts.SourcePassword, opts.SourceDomain);//new VssCredentials(new Microsoft.VisualStudio.Services.Common.WindowsCredential(new NetworkCredential(opts.SourceUserName, opts.SourcePassword, opts.SourceDomain)));
            }
            if (!string.IsNullOrWhiteSpace(opts.TargetUserName) && !string.IsNullOrWhiteSpace(opts.TargetPassword))
            {
                targetCredentials = new NetworkCredential(opts.TargetUserName, opts.TargetPassword, opts.TargetDomain);//new VssCredentials(new Microsoft.VisualStudio.Services.Common.WindowsCredential(new NetworkCredential(opts.TargetUserName, opts.TargetPassword, opts.TargetDomain)));
            }
            me.AddNetworkCredentials(sourceCredentials, targetCredentials);
            if (!string.IsNullOrWhiteSpace(opts.ChangeSetMappingFile))
            {
                IChangeSetMappingProvider csmp = new ChangeSetMappingProvider(opts.ChangeSetMappingFile);
                csmp.ImportMappings(me.ChangeSetMapping);
            }

            Log.Information("Engine created, running...");
            me.Run();
        }
예제 #25
0
 Composer Composer.Execute(Action action, ExecuteOptions options)
 {
     _composer.Execute(x => action(), options);
     return(this);
 }
예제 #26
0
        /// <summary>
        /// ExecuteOnChannel method implementation
        /// </summary>
        private T Execute <T>(string operationName, ExecuteOptions options, ExecuteDelegate <T> operation)
        {
            T      result;
            object obj = null;

            using (new SPMonitoredScope("Execute :" + operationName))
            {
                bool   mustexit     = false;
                string firstaddress = "";
                do
                {
                    SPServiceLoadBalancerContext loadBalancerContext = m_LoadBalancer.BeginOperation();
                    try
                    {
                        if (firstaddress.Equals(loadBalancerContext.EndpointAddress.ToString()))
                        {
                            mustexit = true;
                        }
                        if (!mustexit)
                        {
                            if ((loadBalancerContext.Status == SPServiceLoadBalancerStatus.Succeeded))
                            {
                                if (string.IsNullOrEmpty(firstaddress))
                                {
                                    firstaddress = loadBalancerContext.EndpointAddress.ToString();
                                }

                                IIdentityServiceContract identityapplication = GetChannel(loadBalancerContext.EndpointAddress, options);
                                IClientChannel           clientChannel       = identityapplication as IClientChannel;
                                try
                                {
                                    obj = operation(identityapplication);
                                    clientChannel.Close();
                                    mustexit = true;
                                }
                                catch (TimeoutException)
                                {
                                    loadBalancerContext.Status = SPServiceLoadBalancerStatus.Failed;
                                }
                                catch (EndpointNotFoundException)
                                {
                                    loadBalancerContext.Status = SPServiceLoadBalancerStatus.Failed;
                                }
                                finally
                                {
                                    if (clientChannel.State != CommunicationState.Closed)
                                    {
                                        clientChannel.Abort();
                                    }
                                }
                            }
                        }
                    }
                    finally
                    {
                        loadBalancerContext.EndOperation();
                    }
                }while (!mustexit);
                result = (T)((object)obj);
            }
            return(result);
        }
예제 #27
0
 private static int Run(ExecuteOptions options) =>
 GetApplication(options).Run(options);
 public EngineConfigurationWrapper(IEngineConfigurationBuilder engineConfigurationBuilder, ExecuteOptions opts, ILogger <EngineConfigurationWrapper> logger)
 {
     if (opts == null) //means that we are in init command and not execute
     {
         _engineConfiguration = engineConfigurationBuilder.BuildDefault();
         return;
     }
     if (opts.ConfigFile == string.Empty)
     {
         opts.ConfigFile = "configuration.json";
     }
     if (!File.Exists(opts.ConfigFile))
     {
         logger.LogInformation("The config file {ConfigFile} does not exist, nor does the default 'configuration.json'. Use '{ExecutableName}.exe init' to create a configuration file first", opts.ConfigFile, Assembly.GetEntryAssembly().GetName().Name);
         throw new ArgumentException("missing configfile");
     }
     logger.LogInformation("Config Found, creating engine host");
     _engineConfiguration = engineConfigurationBuilder.BuildFromFile(opts.ConfigFile);
 }
예제 #29
0
 Composer <T> Composer <T> .ExecuteAsync(Func <T, CancellationToken, Task <T> > taskFactory, ExecuteOptions options)
 {
     _task = Execute(_task, payload => taskFactory(payload, _cancellationToken), options);
     return(this);
 }
예제 #30
0
 Composer <T> Composer <T> .Execute(Action <T> action, ExecuteOptions options)
 {
     _task = Execute(_task, payload => TaskUtil.RunSynchronously(payload, action, _cancellationToken), options);
     return(this);
 }
예제 #31
0
 /// <summary>
 /// Constructor
 /// </summary>
 public CSExecutor()
 {
     rethrow = false;
     options = new ExecuteOptions();
 }
예제 #32
0
 Composer Composer.Finally(Action <TaskStatus> continuation, ExecuteOptions options)
 {
     _composer.Finally((x, status) => continuation(status), options);
     return(this);
 }