OrderBy 任务函数异步中的列表

OrderBy an list in a task function async

好的,我正在使用 orleans,我真正想做的就是在状态值之后对列表进行排序。我尝试这样做

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

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

        return Task.FromResult(a);
    }

但是我试图解决其中的两个错误。第一个 Task SortEntries 任务缺少 await 运算符,我想它可能仍然有效像这样排序条目

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

但是 GetState() 需要与 await 异步,但我不能在 orderBy 或排序上这样做。谁能把我推向正确的方向或遇到类似的事情

1.) OrderBy 不适用于 async/await。一个简单的解决方法是在 GetComparator

中使用 GetState 的结果 属性
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 return 只有一个 IEnumerable,所以不会在那里订购。执行order by需要枚举一次。并且您需要 return 结果,因为 OrderBy 只是 return 一个有序列表,但不对列表本身进行排序。

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