OrderBy список в функции задачи асинхронный - PullRequest
0 голосов
/ 16 ноября 2018

Хорошо, я работаю с Орлеаном, и все, что я действительно хочу сделать, это отсортировать список после значения в состоянии. я пытаюсь сделать это, делая это

public async Task SortEntries()
    {
         State.Entries.OrderBy(GetComparator);
    }

    private async decimal GetComparator(IEntryGrain x)
    {
        var a = await x.GetState();

        return Task.FromResult(a);
    }

но в этом есть две ошибки, которые я пытаюсь решить. Во-первых, в задаче SortEntries отсутствует оператор ожидания, который, я думаю, все еще может работать, проблема в том, что GetComparator говорит, что асинхронный метод должен быть пустым, Task или Task. Самый аккуратный способ, который я впервые подумал, - это выполнить всю сортировку в SortEntries, например это

State.Entries.OrderBy((x) => x.GetState().Result.TotalPoints);

Но GetState () должен быть асинхронным с ожиданием, но я не могу сделать это на orderBy или сортировать. Любой, кто может подтолкнуть меня в правильном направлении или столкнулся с чем-то похожим

1 Ответ

0 голосов
/ 16 ноября 2018

1.) OrderBy не работает с async / await. Исправление было бы использовать свойство Result GetState в GetComparator

private decimal GetComparator(IEntryGrain x)
{
    var task = x.GetState();
    task.Wait();

    if(task.IsFaulted)
        throw new Exception($"could not get the state: {task.Exception}", task.Exception);

    return task.Result;
}

2.) OrderBy возвращает только IEnumerable, поэтому заказывать его там не нужно. Нужно перечислить его один раз, чтобы выполнить заказ. И вам нужно вернуть результат, потому что OrderBy возвращает только упорядоченный список, но не упорядочивает сам список.

public IList<IEntryGrain> SortEntries()
{
     return State.Entries.OrderBy(GetComparator)
                         .ToList();
}

или запишите его обратно в свойство, если оно доступно для записи и безопасно для потоков

public void SortEntries()
{
     State.Entries = State.Entries.OrderBy(GetComparator)
                                  .ToList();
}

Итак, вы получите:

public IList<IEntryGrain> SortEntries()
{
    return State.Entries.OrderBy(GetComparator)
                        .ToList();
}

private decimal GetComparator(IEntryGrain x)
{
    var task = x.GetState();
    task.Wait();

    if(task.IsFaulted)
        throw new Exception($"could not get the state: {task.Exception}", task.Exception);

    return task.Result;
}
...