在C#中异步使用IComparer

我们已经将代码库升级为使用async / await,但是由于新的异步代码(HttpContext = null是常见问题),许多以前可以使用的方法现在崩溃了.我不确定如何解决此IComparer.Compare()方法.有任何想法吗?似乎我不能在Compare方法上使用异步任务:

public int Compare(myClass x, myClass y)
{
    int someInteger;

    // Standard, boring sorting code here.

    // This is an MVC application calling into an Async method() here...
    var xx = x.CallNewAsyncMethod();
    var yy = y.CallNewAsyncMethod();
    // Work with xx and yy now...
    return someInteger;
}

如果我无法使.NET IComparer.Compare()方法异步,是否可以使用其他替代方式(例如LINQ)对我的类进行排序?需要注意的一件事是,我已经简化了上面的代码,但是里面确实有很多事情发生,而且我们的排序代码并不简单.我们可以使用大约10种不同的类别,每种类别实际上是一个三级类别(按a,然后b,然后c)进行排序.

谢谢你的帮助!

解决方法:

many previously working methods now crash as a result of the new asynchronous code (HttpContext = null being a common issue).

默认情况下,await将正确保留HttpContext,所以我发现这个问题很奇怪.请确保您正在.NET 4.5上运行,并且还以web.config中的ASP.NET 4.5为目标(默认情况下,升级后的项目将以ASP.NET 4.0为目标,这与await不兼容).

I’m not sure how to get around this IComparer.Compare() method.

这是我第一次听说有人进行异步比较.多么有趣的主意.

建议您在比较两个内存对象时不要执行I / O或远程服务调用.如果需要执行I / O,则在比较之前进行.您可以将I / O结果存储在对象中,从对象到比较值的字典映射中或以星历表形式存储.然后,您的Compare方法完全在内存中工作,并且可以同步.

上一篇:Silverlight 结合ArcGis 在地图上画线


下一篇:C#排序/比较项目