asp.net中的异步方法导致请求永远不会完成

时间:2014-07-17 04:22:15

标签: c# asp.net-mvc async-await amazon-dynamodb

我有一个async asp.net mvc 4动作,看似很好。

通过它进行调试可以按预期工作。

问题是,当它出现在生产中时,一段时间后,请求开始堆积,没有任何处理。这听起来像是某种僵局,但我不确定问题出在哪里。

public async Task<ActionResult> Index()
{
    //some work
    var user = PopulateUser();
    try
    {
        await DynamoUtil.WriteToDynamoAsync(user);
    }
    catch (Exception x)
    { 
        //standard log4net logging
        _log.Error("Error writing to dynamo", x);
    }

    //.. some more work

    return Redirect(url);
}

我的WriteToDynamoAsync方法类似于此

public static class DynamoUtil
{
    //..

    //instantiated in static constructor
    private static DynamoDBContext _context;

    public static async Task WriteToDynamoAsync(User user)
    {
        try
        {
            var batch = _context.CreateBatchWrite<User>();
            batch.AddPutItem(user);
            await batch.ExecuteAsync().ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            _log.Error("Error executing batch", ex);
            throw;
        }
    }
}

另一件需要注意的事情是,如果我删除await方法上的第一个WriteToDynamoAsync,它就可以了。一切都在继续。这样做的问题是我希望确实将项目写入Dynamo,如果不这样做,我希望记录异常。

任何人都可以看到上述问题或有任何建议吗?

此外,我尝试使用和不使用ConfigureAwait,但似乎没有改变任何结果。

我无法重现不受欢迎的行为调试,但是当它处于活动状态并且每秒钟被4到5个请求命中时,整个网站将在一两分钟内停止工作。

1 个答案:

答案 0 :(得分:0)

首先,您已经在WriteToDynamoAsync本身记录了任何潜在的例外情况,为什么还要在Index中进行记录?

第二,你的问题很可能是你在生产中有更多的并发请求而不是在开发中,并且在前一种情况下你的数据库连接速度要慢得多(在后者中它甚至可能在同一台机器上)。

第三,不要在ConfigureAwait(false)中使用Index因为你需要它来返回完全相同的请求线程(它不是静态的)。

最后,您必须更快地建立生产数据库连接,或以某种方式降低其使用率(减少数据库调用次数)。

此外,如果await属于关键业务,请不要从WriteToDynamoAsync移除;否则,如果应用域回收,则可能无法完成,您甚至都不知道。{/ p>

相关问题