Используйте IComparer в асинхронном режиме в C#

Мы обновили нашу кодовую базу для использования async/await, но многие ранее работающие методы теперь терпят крах в результате нового асинхронного кода (HttpContext = null является распространенной проблемой). Я не уверен, как обойти этот метод IComparer.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).

Спасибо за вашу помощь!

2 ответа

Решение

многие ранее работающие методы теперь терпят крах в результате нового асинхронного кода (HttpContext = null является распространенной проблемой).

await правильно сохранит HttpContext по умолчанию, поэтому я нахожу эту проблему странной. Убедитесь, что вы работаете в.NET 4.5 и нацелены на ASP.NET 4.5 в вашем web.config (по умолчанию обновленные проекты нацелены на ASP.NET 4.0, который несовместим с await).

Я не уверен, как обойти этот метод IComparer.Compare().

Это первый раз, когда я слышал, чтобы кто-нибудь делал асинхронное сравнение. Какая... "интересная"... идея.

Я бы порекомендовал вам не выполнять операции ввода-вывода или удаленного вызова служб при сравнении двух объектов в памяти. Если вам нужно сделать I/O, то сделайте это перед сравнениями. Вы можете сохранить результаты ввода / вывода либо в объектах, либо в словаре, отображающем объекты в значения сравнения, или в виде эфемеронов. Тогда ваш Compare Метод работает полностью в памяти и может быть синхронным.

Вы можете сделать метод синхронным, но если вам нужно сделать это в больших масштабах, это может стать громоздким. использование .Wait() после присвоения переменной, чтобы убедиться, что значение заполняется, прежде чем двигаться дальше. Это не потребует, чтобы ваш метод сравнения был отмечен как асинхронный.

var xx = x.CallNewAsyncMethod();
xx.Wait();//blocks until CallNewAsyncMethod completes
Другие вопросы по тегам