好的,我正在与奥尔良一起工作,而我真正想做的就是对状态值后的列表进行排序。我尝试这样做
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上这样做。可以将我推向正确方向或遇到类似情况的人
答案 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;
}