Следующая строка является проблемой:
this.Session["Culture"] = ci;
Вы пишете на сессию. В ASP.NET сеанс не является потокобезопасным. По этой причине ASP.NET синхронизирует доступ к нему. В основном это означает, что если вы нажмете обработчик ASP.NET, который выполняет запись в сеанс из 2 параллельных запросов из одного сеанса , ASP.NET просто выполнит их последовательно.
Не пойми меня неправильно. Это не означает, что два параллельных запроса от 2 разных пользователей будут выполняться последовательно. Они будут идеально параллельны. Просто я предполагаю, что вы выполнили 2 параллельных AJAX-запроса к этому действию контроллера и наблюдали за поведением в FireBug или чем-то еще. Поскольку 2 AJAX-запроса были из одного и того же сеанса, и поскольку вы записываете в сеанс, вы попали в очередь, ваши запросы не могут выполняться параллельно.
Вам нужно будет найти другой способ обращения с культурой. Cookies или параметры URL (лучше с точки зрения SEO) приходят на ум в качестве хорошей альтернативы. А поскольку сеансы в любом случае плохие, избавиться от них будет полезно только для вашего приложения.
В ASP.NET MVC 3 вы можете использовать атрибут SessionState, чтобы указать, что действие контроллера либо не будет использовать сессию, либо будет только читать из него:
[SessionState(SessionStateBehavior.ReadOnly)]
public class FooController: AsyncController
{
}
Теперь вы можете выполнять параллельную обработку запросов из одного сеанса. Очевидно, что каждая попытка записи в сеанс вызовет исключение.