调用异步方法配置控制器。有时

时间:2014-01-17 09:27:03

标签: 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服务器,断点等。由于Controller中的以下内容,上面的内容会间歇地抛出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);
}

Preemtively,我可以让动作异步吗?是的,我将在其中一天,在应用范围内,在受控阶段。请告诉我,我是否可以期待我的问题消失。

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

1 个答案:

答案 0 :(得分:1)

我遇到了这个问题,整整一天都困扰着我。我终于意识到我ActionInvoker中的ControllerFactory正在继承ControllerActionInvoker。当我将其更改为AsyncControllerActionInvoker时,问题就消失了。