Asp.net mvc 4 调用异步方法处理控制器。有时

Asp.net mvc 4 调用异步方法处理控制器。有时,asp.net-mvc-4,asynchronous,entity-framework-5,Asp.net Mvc 4,Asynchronous,Entity Framework 5,像这样 public ActionResult SomeAction() { var foo = SomeMethodAsync().Result; if (foo) Respository.Update(); //Repository pattern, calls save changes on my ObjectContext. } 控制顺序是任意的,这取决于很多东西、web服务器、断点等。由于控制器中存在以下情况,上述操作会间歇性地抛出Repositor

像这样

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

    if (foo)
        Respository.Update(); //Repository pattern, calls save changes on my ObjectContext.
}
控制顺序是任意的,这取决于很多东西、web服务器、断点等。由于控制器中存在以下情况,上述操作会间歇性地抛出Repository.Update()调用

    protected override void Dispose(bool disposing)
    {
        Repository.Dispose();
    }
因此,根据是否调用了SomeMethodAsync,将调用Dispose(),并及时释放ObjectContext以满足需要。显然,控制器本身并没有被处置,但有东西正在为它做准备

那么我可以避免这种情况吗

我向您展示了以下内容,以便您可以看到ConfigureWait(false),它可能与此有关,也可能与此无关。但是,如果我删除它,则有可能该方法根本无法运行到完成状态—在生产中,大多数情况下不会

public async Task<bool> SomeMethodAsync()
{
    return await IOMethodAsync().ConfigureAwait(false);
}
公共异步任务SomeMethodAsync() { 返回await IOMethodAsync().ConfigureAwait(false); } 首先,我可以使操作异步吗?是的,总有一天我会在一个受控的阶段,在应用程序范围内。一定要告诉我我的问题是否能解决


为什么要在Dispose()中处理ObjectContext?我不知道,我忘了。也许不再需要它了。但我想一直保持这种状态,直到我知道为止,因此我提出了这个问题。

我有这个问题,它困扰了我整整一天。我终于意识到我在我的
ControllerFactory中连接的
ActionInvoker
是从
ControllerActionInvoker
继承的。当我将其更改为
AsyncControllerActionInvoker
时,问题消失了。

在您的问题中,您声明调用了
Dispose
,然后说“显然控制器本身没有被释放”。哪一个?好问题,我自己也不完全明白。调用Disposed()。然后运行操作的条件和最终语句。。。它们在控制器中。。。在某种意义上,它显然没有被完全处理,但它仍然与之相关;该存储库(一个成员)仍然存在……当一个类型的某个方法中仍有代码运行时,它可能被GC’ed(并最终确定)。然而,如果看到MVC表现出这种行为,我会有点惊讶,除非您在控制器生命周期中使用了非标准的东西。试着在
存储库之前放入
if(disposing)
。Dispose
(无论如何,它应该在那里;在完成时,你不应该在其他实例上调用
Dispose
)。好的,我会这样做。嗨,Martin,你还想知道我的解决方案对你的情况是否有效吗?哇,好的,我要试一试。谢谢(如果我没有选择你的答案,请提醒我。)看起来你已经在这个问题上坐了一年了?这将是有趣的,知道这是否解决您的问题。最后检查!唉,不。我的项目不是这样设置的。它继承了MVC以前版本的风格。还有一个较新的webapi项目,其中继承了ApiControllerActionInvoker,它是异步的。