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); }
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); }