2014-01-17 3 views
0

Нравится.Вызов метода асинхронного вызова. Иногда

public ActionResult SomeAction() 
{ 
    var foo = SomeMethodAsync().Result; 

    if (foo) 
     Respository.Update(); //Repository pattern, calls save changes on my ObjectContext. 
} 

Порядок контроля произвольно, в зависимости от Лота вещей, веб-сервера, точки останова и т.д. Intermittently выше будет бросать на вызов Repository.Update() из-за следующих в контроллере.

protected override void Dispose(bool disposing) 
    { 
     Repository.Dispose(); 
    } 

Поэтому в зависимости от того, если SomeMethodAsync которые должны быть вызваны или нет, Dispose() вызывается и ObjectContext расположен как раз вовремя для того, чтобы быть необходимо. Очевидно, что сам контроллер не настроен, но что-то готовит его.

Могу ли я избежать этого?

Я показываю вам нижеследующее, чтобы вы могли видеть ConfigureAwait (false), который может или не может иметь к этому какое-то отношение. Если я удалю его, то есть вероятность того, что метод не будет завершен вообще - в производстве, в большинстве случаев нет.

public async Task<bool> SomeMethodAsync() 
{ 
    return await IOMethodAsync().ConfigureAwait(false); 
} 

Предположительно, могу ли я сделать асинхронное действие? Да, и я на днях, в широком масштабе, окажусь в контролируемой фазе. Скажите мне, могу ли я ожидать, что мои проблемы уйдут.

Почему я удаляю ObjectContext в Dispose()? Я не знаю, я забыл. Может быть, это больше не нужно. Но я бы хотел сохранить это до тех пор, пока не узнаю, следовательно, вопрос.

спасибо.

+0

В вашем вопросе вы заявляете, что вызывается 'Dispose', а затем говорят, что« очевидно, что сам контроллер не расположен ». Что он? –

+0

Хороший вопрос, и я сам этого не понимаю. Вызывается Disposed(). Затем выполняются условие и окончательный оператор действия ... которые находятся в контроллере ... который, очевидно, не был полностью удален в смысле чего-то еще, имеет ссылку на него; этот репозиторий, член, все еще существует ... – Martin

+0

* Возможно * для типа, который должен быть GC'ed (и финализирован), пока есть еще код для запуска одним из его методов. Тем не менее, я был бы немного удивлен, увидев, что MVC демонстрирует это поведение, если вы не используете что-то нестандартное для жизни контроллера. Попробуйте ввести 'if (распоряжаться)' перед 'Repository.Dispose' (он должен быть там в любом случае; при завершении вы должны * не * вызывать' Dispose' в других экземплярах). –

ответ

1

У меня была эта проблема, и это беспокоило меня целый день. Я наконец понял ActionInvoker Я подключался в своем ControllerFactory наследовал от ControllerActionInvoker. Когда я изменил это на AsyncControllerActionInvoker, проблема исчезла.

+1

wow, ладно, я собираюсь отдать это. Благодаря! (напомните мне, если я не смогу выбрать ваш ответ.) – Martin

+0

Похоже, вы сидите на этом один год? Будет интересно узнать, решит ли это вашу проблему. – Hanshan

+0

Наконец-то проверено! Увы, нет. Мой проект не настроен таким образом. Он наследует свой стиль от предыдущих версий MVC. Существует также новый проект webapi, где есть наследование от ApiControllerActionInvoker, который является асинхронным. – Martin

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