【问题标题】:Use IComparer Asynchronously in C#在 C# 中异步使用 IComparer
【发布时间】:2015-08-13 23:34:28
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 返回的是什么东西?
  • 这可能会非常昂贵 - 确保你让它变得懒惰并缓存结果。
  • 我同意 Daniel 的观点,如果您在这些类上使用 Sort、OrderBy 或 Contains,那么调用该异步方法的成本很快就会成为问题。
  • @DanielA.White 该函数返回一个收藏项目列表,可按日期、价格等排序。我的最佳猜测是普通用户会有 5-10 个收藏夹,最多 20 个。跨度>

标签: c# sorting asynchronous compare icomparer


【解决方案1】:

许多以前工作的方法现在由于新的异步代码而崩溃(HttpContext = null 是一个常见问题)。

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

我不确定如何绕过这个 IComparer.Compare() 方法。

这是我第一次听说有人在进行异步比较。多么……“有趣”的……想法。

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

【讨论】:

  • RE: HttpContext 我正在重构代码,我相信这部分已经到期,因为对于那个特定的调用链,我的代码还不是“一路异步”。然而,我觉得奇怪的是,WebForms 网站不受新异步代码的影响,但我正在开发的 MVC 移动网站仍然卡住,使用相同的代码。
  • RE: IComparer.Compare() 也许我的代码示例会更好。我要表达的是,旧的比较函数现在必须处理最近在调用堆栈中进一步引入的异步操作。我同意,这可能应该被重构,而不仅仅是将我的方法重新定义为异步等待。 :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多