在 C# 中异步使用 IComparer

Use IComparer Asynchronously in C#

我们已经升级了我们的代码库以使用 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 排序)。

感谢您的帮助!

您可以使方法同步,但如果必须大规模执行此操作,可能会变得很麻烦。在分配变量后使用 .Wait() 以确保在继续之前填充该值。它不需要将您的比较方法标记为异步。

var xx = x.CallNewAsyncMethod();
xx.Wait();//blocks until CallNewAsyncMethod completes

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 上 运行 并且 targeting ASP.NET 4.5 在您的 web.config 中(默认情况下,升级的项目将以 ASP.NET 4.0,与 await).

不兼容

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

这是我第一次听说有人在做异步 比较。多么..."interesting"...想法。

我建议您在比较两个内存中对象时不要执行 I/O 或远程服务调用。如果你需要做I/O,那么在比较之前做。您可以将 I/O 结果存储在对象中,存储在从对象到比较值的字典映射中,或者存储为 ephemerons。然后你的 Compare 方法完全在内存中工作并且可以是同步的。