public async Task EnsureTasksHaveOwnership()
        {
            var healthChecks = AllPeers().Select(async x =>
            {
                var status = await x.CheckStatusOfOwnedTasks().ConfigureAwait(false);
                return(new { Peer = x, Response = status });
            }).ToArray();

            var checks = await Task.WhenAll(healthChecks).ConfigureAwait(false);


            var planner = new TaskHealthAssignmentPlanner(_permanentTasks);

            foreach (var check in checks)
            {
                planner.Add(check.Peer, check.Response);
            }


            var corrections = planner.ToCorrectionTasks(this);

            await Task.WhenAll(corrections).ConfigureAwait(false);

            _logger.Info(() => "Finished running task health monitoring on node " + NodeId);
        }
        public Task EnsureTasksHaveOwnership()
        {
            var healthChecks = allPeers().Select(x => x.CheckStatusOfOwnedTasks().ContinueWith(_ => {
                return(new { Peer = x, Response = _.Result });
            }));

            return(Task.WhenAll(healthChecks).ContinueWith(checks => {
                var planner = new TaskHealthAssignmentPlanner(_permanentTasks);
                checks.Result.Each(_ => planner.Add(_.Peer, _.Response));

                var corrections = planner.ToCorrectionTasks(this);

                return Task.WhenAll(corrections).ContinueWith(_ => {
                    _logger.Info(() => "Finished running task health monitoring on node " + NodeId);
                }, TaskContinuationOptions.AttachedToParent);
            }, TaskContinuationOptions.AttachedToParent));
        }
        public Task EnsureTasksHaveOwnership()
        {
            var healthChecks = allPeers().Select(x => x.CheckStatusOfOwnedTasks().ContinueWith(_ => {
                return new {Peer = x, Response = _.Result};
            }));

            return Task.WhenAll(healthChecks).ContinueWith(checks => {
                var planner = new TaskHealthAssignmentPlanner(_permanentTasks);
                checks.Result.Each(_ => planner.Add(_.Peer, _.Response));

                var corrections = planner.ToCorrectionTasks(this);

                return Task.WhenAll(corrections).ContinueWith(_ => {

                    _logger.Info(() => "Finished running task health monitoring on node " + NodeId);

                }, TaskContinuationOptions.AttachedToParent);
            }, TaskContinuationOptions.AttachedToParent);
        }
        public async Task EnsureTasksHaveOwnership()
        {
            var healthChecks = AllPeers().Select(async x =>
            {
                var status = await x.CheckStatusOfOwnedTasks().ConfigureAwait(false);
                return new { Peer = x, Response = status };
            }).ToArray();

            var checks = await Task.WhenAll(healthChecks).ConfigureAwait(false);


            var planner = new TaskHealthAssignmentPlanner(_permanentTasks);
            foreach (var check in checks)
            {
                planner.Add(check.Peer, check.Response);
            }


            var corrections = planner.ToCorrectionTasks(this);

            await Task.WhenAll(corrections).ConfigureAwait(false);

            _logger.Info(() => "Finished running task health monitoring on node " + NodeId);
        }