2009-07-08 6 views
1

Wir geben in ein paar Tagen eine Demo und ich muss viele unserer Ansichten nachmachen. Dazu gehört das Erstellen vieler gefälschter Daten usw. Ich dachte, ich würde eine Schleife und eine Erweiterungsmethode einfügen, die Zufallszahlen zurückgibt, so dass ich diese hartcodierten Daten nicht selbst erstellen muss.Warum gibt meine Zufallszahlen-HTML-Erweiterungsmethode die gleichen Werte zurück?

Hier ist meine Ansicht Code:

<% 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> 
<% } %> 

Hier ist, was meiner Meinung nach sieht nach tun: alt text

Gleiche Zahlen auf der ganzen Linie. Werden meine Anfragen nach Zufallszahlen zwischengespeichert und an mich zurückgeschickt? Wenn ja, wie schalte ich diese Funktionalität nur für diese Methode aus?

public static string GetRandomNumber(this HtmlHelper html, int low, int high) 
{ 
    Random myRand = new Random(); 
    return myRand.Next(low, high).ToString(); 
} 

Antwort

10

Wie immer mit dieser Art von Problem, das Problem ist, dass Sie bei jeder Iteration eine neue Instanz Random sind zu schaffen.

Erstellen Sie eine einzelne Instanz und verwenden Sie sie wiederholt. Sie können eine statische Variable verwenden, die jedoch nicht Thread-sicher ist. In diesem speziellen Fall wäre das Erstellen einer neuen Instanz pro Seite wahrscheinlich in Ordnung. Sie erhalten jedoch immer noch dieselben Daten, wenn zwei Personen gleichzeitig auf die Seite zugreifen.

Im Idealfall könnten Sie eine statische Zufallsauswahl erstellen, die threadsicher verwendet wird, um neue Instanzen von Random zu erstellen, die dann ohne Sperren innerhalb eines einzelnen Threads verwendet werden können. Zum Beispiel:

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()); 
     } 
    } 
} 

dann in Ihrer Seite könnten Sie haben:

// Instance variable 
protected readonly Random rng = RandomFactory.CreateRandom(); 

und Ihre Methode ändern:

public static string GetRandomNumber(this HtmlHelper html, Random rng, 
            int low, int high) 
{ 
    return rng.Next(low, high).ToString(); 
} 

(ich ziemlich sicher bin, nicht, warum du hast HtmlHelper überhaupt, um ehrlich zu sein - Sie verwenden es nicht ...)

und schließlich Ihr Mark-up zu Dingen wie diesem:

<%= Html.GetRandomNumber(rng, 0, 30) %> 
+0

nicht ich brauche "diese Htmlhelper html", um für Es ist eine Erweiterungsmethode? – KingNestor

+0

Sie erwähnen auch, dass eine einzelne statische Instanz nicht Thread-sicher ist. Kannst du das für mich erklären? Was könnte möglicherweise mit einer Menge von Threads passieren, die möglicherweise next() für dieselbe Instanz aufrufen? – KingNestor

+0

@KingNestor Sie brauchen das, damit es eine Erweiterungsmethode ist, aber Sie brauchen das nicht, um öffentliche statische Funktion aufzurufen. –

1

verweise ich Sie auf here:

getRandomNumber

:-P

</Sarkasmus>

Verwandte Themen