我们将在几天内进行演示,我必须进入并模拟我们的许多观点。这包括制作大量假数据等。我想我会放弃一个循环和一个返回随机数的扩展方法,所以我不必自己编写这个硬编码数据。
这是我的观看代码:
<% for(int i = 1; i < 7; i++) { %>
<tr>
<td class="auditsTableAgencyElement">Agency <%=i %></td>
<td class="auditsTableResults"><%= Html.GetRandomNumber(0, 30) %></td>
<td class="auditsTableResults"><%= Html.GetRandomNumber(0, 100) %>%</td>
<td class="auditsTableResults"><%= Html.GetRandomNumber(0, 20) %></td>
<% foreach (var record in Model.Categories) { %>
<td class="auditsTableResults"><%= Html.GetRandomNumber(0, 30) %></td>
<td class="auditsTableResults"><%= Html.GetRandomNumber(0, 100) %>%</td>
<td class="auditsTableResults"><%= Html.GetRandomNumber(0, 20) %></td>
<% } %>
</tr>
<% } %>
以下是执行此操作后我的视图:
相同的数字。我的随机数请求是否被缓存并返回给我?如果是这样,我该如何仅为此方法关闭此功能?
public static string GetRandomNumber(this HtmlHelper html, int low, int high)
{
Random myRand = new Random();
return myRand.Next(low, high).ToString();
}
答案 0 :(得分:10)
与此类问题一样,问题是您在每次迭代时都在创建一个新的Random
实例。
创建单个实例并重复使用它。您可以使用静态变量,但这不是线程安全的。在这种特殊情况下,每页创建一个新实例可能没问题。但是,如果两个人同时访问该页面,您仍将获得相同的数据。
理想情况下,您可以创建以线程安全方式使用的静态随机数,以创建Random的新实例,然后可以在不锁定单个线程的情况下使用它。例如:
public static class RandomFactory
{
private static Random rng = new Random();
private static readonly object padlock = new object();
public static Random CreateRandom()
{
lock (padlock)
{
return new Random(rng.Next());
}
}
}
然后在您的页面中,您可以:
// Instance variable
protected readonly Random rng = RandomFactory.CreateRandom();
并将您的方法更改为:
public static string GetRandomNumber(this HtmlHelper html, Random rng,
int low, int high)
{
return rng.Next(low, high).ToString();
}
(我不太清楚为什么你在那里得到HtmlHelper
,说实话 - 你没有使用它......)
最后你加入了这样的事情:
<%= Html.GetRandomNumber(rng, 0, 30) %>
答案 1 :(得分:1)