C# OrderBy任务函数async中的列表

C# OrderBy任务函数async中的列表,c#,asynchronous,orleans,C#,Asynchronous,Orleans,好的,我正在与奥尔良合作,我真正想做的就是在状态值之后对列表进行排序。我试着通过这样做来解决这个问题 public async Task SortEntries() { State.Entries.OrderBy(GetComparator); } private async decimal GetComparator(IEntryGrain x) { var a = await x.GetState(); r

好的,我正在与奥尔良合作,我真正想做的就是在状态值之后对列表进行排序。我试着通过这样做来解决这个问题

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说异步方法必须是void、Task或Task。我首先想到的最简洁的方法是在SortEntries中像这样进行所有排序

State.Entries.OrderBy((x) => x.GetState().Result.TotalPoints);
但是GetState()需要与wait异步,但我不能在orderBy或sort上这样做。任何能将我推向正确方向或遇到类似问题的人。
OrderBy
不能使用async/await。qiuck修复方法是在GetComparator中使用GetState的Result属性

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 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;
}
公共IList分拣入口()
{
返回状态.Entries.OrderBy(GetComparator)
.ToList();
}
专用十进制GetComparator(IEntryGrain x)
{
var task=x.GetState();
task.Wait();
if(task.IsFaulted)
抛出新异常($“无法获取状态:{task.Exception}”,task.Exception);
返回任务。结果;
}

State.Entries.OrderBy(异步(x)=>等待GetComparator(x))
State.Entries.OrderBy(GetComparator)行为一致,而不是您的版本分配了更多的对象并花费了更多的时间。除了性能降低之外,两者之间没有明显的差异。此外,您的第二个和最后一个方法根本不会编译,因为您返回的类型是编译器不希望为这些方法返回的类型。现在您只是同步阻止异步操作,这将导致死锁,而不是异步执行工作,这就是在这里首先进行异步操作的全部意义。它将杀死奥尔良调度程序,永远不要在奥尔良使用阻塞调用!我宁愿重新思考整个问题。您真的想在每次排序期间为每次比较调用另一个粒度吗?即使没有阻塞调用,它也会破坏性能:条目颗粒将从DB加载到内存中,通常在其他节点上,等等。如果条目是对颗粒的一些引用,则缓存用于比较的值。但是你真的需要谷物来制作参赛作品吗?还是仅仅是POCOs?条目是DDD/聚合根吗?将异步方法转换为sync是个坏主意,正如@Servy所建议的,您应该只使用普通异步
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;
}