2014-11-30 2 views
1

Я пытаюсь получить результат LINQ запроса с помощью .ToListAsync() Внутри используя заявление DbContext, код:ToListAsync() в DbContext с использованием инструкции: «ObjectContext disposed», как бороться?

private async Task<List<String>> GetEntiteesAsync() 
{ 
    Task<List<String>> returnValue; 

    using (var entities = new REPORTEntities()) 
    { 
      returnValue = (from user in entities.USERs 
         group user by user.entite into g 
           select g.Key).ToListAsync(); 
    } 

    return await returnValue; 
} 

при запуске я получаю «Экземпляр ObjectContext был захоронен и больше не могу быть использован для операции, требующие подключения ». как показано ниже:

enter image description here

Я полагаю, что это вызвано тем, что контекст распорядился в то время как объект ReturnValue все еще получал объекты асинхронно как список, Есть обходной путь, чтобы избежать этой ошибки, сохраняя при этом что используя заявление, или я должен просто пойти, выполнив:

private async Task<List<String>> GetEntiteesAsync() 
{ 
    Task<List<String>> returnValue; 

    var entities = new REPORTEntities() 

    returnValue = (from user in entities.USERs 
        group user by user.entite into g 
        select g.Key).ToListAsync(); 

    return await returnValue; 
} 

ответ

7

вы уезжаете в using объем до ToListAsync завершения операции, потому что вы не ожидали асинхронной задачи, что означает entities расположен слишком рано (отсюдаисключение объекта).

Вы просто должны возвращать результат в то время как внутри рамки и механизм async-await удостоверится Dispose вызывается после завершения операции асинхронно:

private async Task<List<String>> GetEntiteesAsync() 
{ 
    using (var entities = new REPORTEntities()) 
    { 
      return await (from user in entities.USERs 
         group user by user.entite into g 
           select g.Key).ToListAsync(); 
    } 
} 
+1

Ой, я получил ослеплен! должен был сделать так, как это с самого начала, не знаю, как я его усложнил, Thx sir! – AymenDaoudi

+1

@AymenDaoudi Конечно, в любое время. – i3arnon

Смежные вопросы