Сначала я использую код EF 4.2 в своем проекте mvc3.
miniprofiler работает нормально (sql + mvc), но у меня проблема с асинхронными задачами.
Я выполняю их таким образом (подходит ли этот метод? Я чувствую себя немного неловко с этим new DatabaseContext()
)
public static void PerformAsycAction(this User user, Action<User> action)
{
ThreadPool.QueueUserWorkItem(_ =>
{
var context = new DatabaseContext();
MiniProfilerEF.Initialize();
var consistantUser = context.Set<User>().Get(user.Id);
action(consistantUser);
context.SaveChanges();
});
}
У меня есть правильная строка в Application_Start:
protected void Application_Start()
{
MiniProfilerEF.Initialize();
...
}
Эксклюзия возникает во время первой операции с БД в action(consistantUser);
вот трассировка:
в MvcMiniProfiler.MiniProfiler.AddSqlTiming (статистика SqlTiming) в C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\MiniProfiler.cs:строка 274 в MvcMiniProfiler.SqlTiming..ctor(команда DbCommand, тип ExecuteType, профилировщик MiniProfiler ) в C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\SqlTiming.cs:строка 137 в MvcMiniProfiler.SqlProfiler.ExecuteStartImpl(команда DbCommand, тип ExecuteType) в C:\Users\sam\Desktop\mvc- mini-profiler\MvcMiniProfiler\SqlProfiler.cs:строка 39 в MvcMiniProfiler.SqlProfilerExtensions.ExecuteStart(SqlProfiler sqlProfiler, команда DbCommand, тип ExecuteType) в C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\SqlProfiler.cs: строка 93 в MvcMiniProfiler.MiniProfiler.MvcMiniProfiler.Data.IDbProfiler.ExecuteStart(DbCommand profiledDbCommand, ExecuteType executeType) в C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\MiniProfiler.IDbProfiler.cs:строка 14 в MvcMiniProfiler. Data.ProfiledDbCommand.ExecuteDbDataReader (поведение CommandBehavior) в C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:строка 158 в System.Data.Common.DbCommand.ExecuteReader(поведение CommandBehavior) в System.Data.EntityClient .EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior)
Что я делаю неправильно? Любая помощь будет оценена.
EDIT: я попытался снова инициализировать MiniProfiler (MiniProfilerEF.Initialize();
) в потоке, в котором выполняется фоновая задача (до запуска DatabaseContext), и теперь есть другое исключение:
Невозможно преобразовать объект типа «MvcMiniProfiler.Data.EFProfiledDbConnection» в тип «System.Data.SqlClient.SqlConnection».
На самом деле нет необходимости профилировать запросы в фоновом потоке, но это крашит весь поток, поэтому приложение работает неправильно, и мне приходится отключать весь профилировщик. Есть ли способ отключить его для этого, фона, потока, чтобы предотвратить его сбой?
DatabaseContext
: вам лучше обернуть его вusing
. - person lorond   schedule 15.04.2012