public async Task <UnitOfWork> ProcessWorkAsync(IUnitOfWorkFileReader reader, UnitOfWork unitOfWork)
        {
            _Logger?.Debug("Started processing: " + unitOfWork?.Id);
            if (IsProcessing)
            {
                throw new Exception("Already processing a unit of work.");
            }
            IsProcessing = true;
            var text = await reader.ReadAllTextAsync(unitOfWork.AssociateFile);

            var strings = Regex.Split(text, "\\s+", RegexOptions.Multiline);
            var result  = Levenshtein.WagnerFischer(strings[0], strings[1]);

            unitOfWork.Result = result[result.GetLength(0) - 1, result.GetLength(1) - 1];
            OnComplete?.Invoke(this, new WorkCompleteEventArgs {
                UnitOfWork = unitOfWork
            });
            IsProcessing = false;
            _Logger?.Debug("Finished processing: " + unitOfWork?.Id);
            return(unitOfWork);
        }
Beispiel #2
0
        public async Task <ElectionResponseType> ElectionRequestAsync(ElectionRequestType type)
        {
            _Logger?.Debug("Requesting election: " + type.ToString());
            var tasks     = new List <Task>();
            var responses = new List <ElectionResponseType>();
            var masterDir = Path.Combine(_PrimaryDirectory, Folders.Master);
            var list      = await _UnitOfWorkFileReader.GetFilesAsync(masterDir);

            var workers = new List <WorkerConnection>();

            if (Master != null && Master.Workers.Any())
            {
                workers.AddRange(Master.Workers);
            }
            foreach (var masterFile in list)
            {
                _Logger?.Debug($"Finding other master nominees.");
                var task         = _UnitOfWorkFileReader.ReadAllTextAsync(masterFile);
                var continueTask = task.ContinueWith(t =>
                {
                    if (task.Result == null)
                    {
                        return;
                    }
                    var candidateMaster = JsonConvert.DeserializeObject <Master>(task.Result);
                    if (candidateMaster == null)
                    {
                        return;
                    }
                    if (!workers.Contains(candidateMaster.Connection))
                    {
                        workers.Add(candidateMaster.Connection);
                    }
                });
                tasks.Add(continueTask);
            }
            await Task.WhenAll(tasks);

            tasks.Clear();
            if (Master == null)
            {
                Master = new Master {
                    Connection = Connection
                }
            }
            ;
            Master.Workers.AddRange(workers);
            Master.Workers = Master.Workers.Distinct().ToList();
            foreach (var worker in Master.Workers)
            {
                Task <ElectionResponse> task = null;
                if (type == ElectionRequestType.Election)
                {
                    task = _ElectionRequester.ElectMeAsync(worker);
                }
                if (type == ElectionRequestType.Resignation)
                {
                    task = _ElectionRequester.ResignAsync(worker);
                }
                var continueTask = task.ContinueWith(t =>
                {
                    _Logger?.Debug($"Response from {worker} was {t.Result.ResponseType}");
                    if (t.Result.ResponseType == ElectionResponseType.NoResponse)
                    {
                        Master.Workers.Remove(worker);

                        PutMasterToSleepAsync(new Master {
                            Connection = worker
                        }, masterDir);
                        _Logger?.Debug("Remove worker: " + worker);
                    }
                    responses.Add(t.Result.ResponseType);
                });
                tasks.Add(continueTask);
            }
            await Task.WhenAll(tasks);

            return(responses.Any() ? responses.Max() : ElectionResponseType.NoResponse);
        }