asp.net-mvc – MVC应用程序中的随机数生成
|
如果每个请求只需要一个数字,那么在ASP.NET MVC应用程序中生成随机数的正确方法是什么?根据MSDN,为了获得足够质量的随机性,有必要使用创建一次的单个System.Random对象生成多个数字.由于为MVC中的每个请求创建了一个控制器类的新实例,因此我不能使用在控件的构造函数中为Random对象初始化的私有字段.那么我应该在MVC应用程序的哪个部分创建和存储Random对象?目前我将它存储在控制器类的静态字段中,并在使用它的action方法中懒惰地初始化它: public class HomeController : Controller
{
...
private static Random random;
...
public ActionResult Download()
{
...
if (random == null)
random = new Random();
...
}
}
由于“随机”字段可以被控制器类的多个实例访问,如果两个实例同时尝试初始化它,它的值是否可能被破坏?还有一个问题:我知道静态的生命周期是应用程序的生命周期,但是对于MVC应用程序,它是什么?它是从IIS启动到IIS关闭吗? 解决方法理想情况下,您希望将Random类的实例维护的时间长于单个页面的生命周期.不要把它放在静态变量中; Random类不是线程安全的,这将导致问题.从 the docs开始:
我最喜欢的方法是来自Microsoft ParallelFX团队的RandomGen2包装器类(他们真正知道他们使用线程做什么),它使用每个线程的实例(主要是)无锁和线程安全的随机数. public static class RandomGen2
{
private static Random _global = new Random();
[ThreadStatic]
private static Random _local;
public static int Next()
{
Random inst = _local;
if (inst == null)
{
int seed;
lock (_global) seed = _global.Next();
_local = inst = new Random(seed);
}
return inst.Next();
}
}
您可以按以下方式拨打电话: var rand = RandomGen2.Next(); 您可能需要添加额外的方法来包装您想要访问的其他Random方法,并且我建议使用更好的名称,例如ThreadSafeRandom,但它证明了原理. (编辑:鲜蔬坊站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 何时使用asp.net mvc的路由规则vs查询字符串
- asp.net – 如何正确地大写希腊字在.NET?
- asp.net-mvc – MicrosoftMvcValidation.js VS jquery.vali
- 在ASP.NET中拒绝用户时,’CustomIdentity’上的Serializati
- asp.net-mvc – 在MVC Controller中访问GET参数
- asp.net – 通过Web服务访问连接字符串
- asp.net删除文件session丢失
- asp.net-mvc-3 – 在同一父视图上多次使用一个部分视图
- ASP.NET Core知多少(7):对重复编译说NO -- dotnet watch
- 何时在ASP.NET上选择LAMP?
- asp.net-web-api – WebAPI:403在发布网站后被禁
- asp.net-mvc – 什么是强类型的视图在ASP.NET MV
- asp.net-mvc-3 – ASP.Net MVC 3:在哪里处理会话
- asp.net-mvc-2 – 如何在ASP.NET MVC2中为Html.L
- asp.net-mvc – ASP.NET MVC V2 – 好友类
- asp.net – 确定当前页面是否需要授权?
- asp.net – 将web应用程序的项目编译成dll
- 如何通过Asp.net WebAPI中的异常过滤器传递内容?
- asp.net-mvc – ASP.NET MVC 2预览2:区域重复控
- asp.net – CookieContainer和Response.Cookies集
