通过任务功能中的列表异步

时间:2018-11-16 08:42:03

标签: c# asynchronous 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运算符,我猜它可能仍然可以解决问题是GetComparator说一个异步方法必须是空的,Task或Task。我最初想到的最简洁的方法是在SortEntries中进行所有排序,例如这个

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

但是GetState()需要与await保持异步,但是我不能在orderBy或sort上这样做。可以将我推向正确方向或遇到类似情况的人

1 个答案:

答案 0 :(得分:2)

1。)OrderBy不适用于异步/等待。解决方法是在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 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;
}