private (SubmissionProcessor <TSubmission> submissionProcessor, Thread thread) CreateRemoteWorker(int index,
                                                                                                          string endpoint,
                                                                                                          ConcurrentQueue <TSubmission> submissionsForProcessing,
                                                                                                          object sharedLockObject,
                                                                                                          IFormatterServiceFactory formatterServiceFactory,
                                                                                                          ISubmissionsFilteringService submissionsFilteringService)
        {
            var worker = new RemoteSubmissionsWorker(
                endpoint,
                formatterServiceFactory);

            var submissionProcessor = new SubmissionProcessor <TSubmission>(
                name: $"RSP #{index}",
                dependencyContainer: this.DependencyContainer,
                submissionsForProcessing: submissionsForProcessing,
                sharedLockObject: sharedLockObject,
                submissionsFilteringService: submissionsFilteringService,
                submissionWorker: worker);

            var thread = new Thread(submissionProcessor.Start)
            {
                Name = $"{nameof(Thread)} #{index}"
            };

            return(submissionProcessor, thread);
        }
        private void SpawnSubmissionProcessorsAndThreads()
        {
            var submissionsForProcessing = new ConcurrentQueue <TSubmission>();
            var sharedLockObject         = new object();

            var threadCount = Environment.ProcessorCount * Settings.ThreadsCount;

            this.Logger.Information(
                "Spawning {SubmissionThreadCount} threads to process submissions (Processor count: {ProcessorCount}, Thread count from config: {ThreadCountFromConfig} )",
                threadCount,
                Environment.ProcessorCount,
                Settings.ThreadsCount);

            for (var i = 1; i <= threadCount; i++)
            {
                var submissionProcessor = new SubmissionProcessor <TSubmission>(
                    name: $"SP #{i}",
                    dependencyContainer: this.DependencyContainer,
                    submissionsForProcessing: submissionsForProcessing,
                    portNumber: Settings.GanacheCliDefaultPortNumber + i,
                    sharedLockObject: sharedLockObject);

                var thread = new Thread(submissionProcessor.Start)
                {
                    Name = $"{nameof(Thread)} #{i}"
                };

                this.submissionProcessors.Add(submissionProcessor);
                this.threads.Add(thread);
            }
        }
        private (SubmissionProcessor <TSubmission> submissionProcessor, Thread thread) CreateLocalWorker(int index,
                                                                                                         ConcurrentQueue <TSubmission> submissionsForProcessing,
                                                                                                         object sharedLockObject,
                                                                                                         ISubmissionsFilteringService submissionsFilteringService)
        {
            var worker = new LocalSubmissionWorker(Settings.GanacheCliDefaultPortNumber + index);
            var submissionProcessor = new SubmissionProcessor <TSubmission>(
                name: $"LSP #{index}",
                dependencyContainer: this.DependencyContainer,
                submissionsForProcessing: submissionsForProcessing,
                sharedLockObject: sharedLockObject,
                submissionsFilteringService: submissionsFilteringService,
                submissionWorker: worker);

            var thread = new Thread(submissionProcessor.Start)
            {
                Name = $"{nameof(Thread)} #{index}"
            };

            return(submissionProcessor, thread);
        }
        private void SpawnSubmissionProcessorsAndThreads()
        {
            var submissionsForProcessing = new ConcurrentQueue <TSubmission>();
            var sharedLockObject         = new object();

            for (var i = 1; i <= Settings.ThreadsCount; i++)
            {
                var submissionProcessor = new SubmissionProcessor <TSubmission>(
                    name: $"SP #{i}",
                    dependencyContainer: this.DependencyContainer,
                    submissionsForProcessing: submissionsForProcessing,
                    portNumber: Settings.GanacheCliDefaultPortNumber + i,
                    sharedLockObject: sharedLockObject);

                var thread = new Thread(submissionProcessor.Start)
                {
                    Name = $"{nameof(Thread)} #{i}"
                };

                this.submissionProcessors.Add(submissionProcessor);
                this.threads.Add(thread);
            }
        }