【发布时间】:2014-06-23 16:24:38
【问题描述】:
我的情况是,我在 IIS 上托管了一个 ASP.NET Web API 2 项目,并且我预计会出现并发问题。我需要生成随机数并确保它们是唯一的(稍后存储在数据库中)。为此,我实现了一个简单的内存 RNG,它依赖于静态 ConcurrentBag。我知道这种实现会给分布式架构带来风险。很快,代码看起来像这样:
public interface IRandomNumberGenerator
{
string ReserveNumber();
string ReleaseNumber(string number);
}
public class InMemoryRandomNumberGenerator : IRandomNumberGenerator
{
private static readonly ConcurrentBag<string> Bag = new ConcurrentBag<string>();
public string ReserveNumber()
{
// Add
throw new NotImplementedException();
}
public string ReleaseNumber(string number)
{
// Remove
throw new NotImplementedException();
}
}
这段代码打算这样使用:
var number = rng.ReserveNumber();
StoreIntoDatabase(number);
rng.ReleaseNumber(number);
我是否正确使用了ConcurrentBag 集合?
另外请注意,我已经简化了我的示例,并且我对将代码移动到 SQL 中并使用 SQL 事务来完成此任务不感兴趣。
【问题讨论】:
-
您可能希望将
InMemoryRandomNumberGenerator变成static class。否则,您并没有真正描述您想用ConcurrentBag<T>做什么。我建议您尝试一下,因为从您提供的信息中我看不出它不合适的原因。 -
@KrisVandermotten 感谢您对 Kris 的反馈。将立即应用更改。
-
你肯定在尝试编译后意识到:静态类无法实现接口......
-
@oleksii,事实上,我自己的类中有实例字段不能使用静态(此示例已简化)。好点子。
标签: c# random concurrency asp.net-web-api thread-safety