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