【发布时间】:2014-09-07 19:28:27
【问题描述】:
我有一个看似工作正常的异步 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;
}
}
}
要注意的另一件事是,如果我在 WriteToDynamoAsync 方法上删除第一个 await,它可以正常工作。一切都在继续前进。这样做的问题是我想真正确保项目被写入 Dynamo,如果没有,我希望记录异常。
任何人都可以看到上面的问题,或者有什么建议吗?
另外,我尝试过使用和不使用ConfigureAwait,这似乎不会改变任何结果。
我无法重现不受欢迎的行为调试,但是当它处于活动状态并受到每秒 4 到 5 个请求的影响时,整个网站将在一两分钟内停止工作。
【问题讨论】:
-
_context.CreateBatchWrite<User>();线程安全吗?如果你从多个线程调用同一个类到实体框架之类的东西中,你可能会导致死锁。 -
@ScottChamberlain
The DynamoDBContext object is thread-safe来自亚马逊文档aws.amazon.com/articles/2790257258340776,所以我认为它是。不过,我还没有窥探该方法的来源。 -
很难调试。此代码是否同步,您可以暂停(远程)调试器并查看线程在做什么。尝试将其转换为同步代码以进行测试和远程调试。
-
您还可以登录到您的 aws 控制台并确保您对 dynamodb 表的请求没有受到限制。
标签: c# asp.net-mvc async-await amazon-dynamodb