我有一个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个请求命中时,整个网站将在一两分钟内停止工作。
答案 0 :(得分:0)
首先,您已经在WriteToDynamoAsync
本身记录了任何潜在的例外情况,为什么还要在Index
中进行记录?
第二,你的问题很可能是你在生产中有更多的并发请求而不是在开发中,并且在前一种情况下你的数据库连接速度要慢得多(在后者中它甚至可能在同一台机器上)。
第三,不要在ConfigureAwait(false)
中使用Index
因为你需要它来返回完全相同的请求线程(它不是静态的)。
最后,您必须更快地建立生产数据库连接,或以某种方式降低其使用率(减少数据库调用次数)。
此外,如果await
属于关键业务,请不要从WriteToDynamoAsync
移除;否则,如果应用域回收,则可能无法完成,您甚至都不知道。{/ p>