2 Stimmen

C#-Multithreading-Code-Problem, das Daten beschädigt

Das ist wirklich sehr nah an der echten Methode, die Bob postete Was wir haben, sind Vorlagen, die mit spezifischen Daten zusammengeführt werden. Der folgende Code versucht, die bereits erstellten Vorlagen wiederzuverwenden. Wenn wir also bereits eine Vorlage für "Dallas" erstellt haben, können wir sie wiederverwenden. Was wir sehen, ist, dass die Vorlage für "Dallas" die Informationen enthält, die die Vorlage für "NewYork" enthalten sollte. Wenn wir langsam durch den Code gehen, sehen wir das nicht. Mein Gedanke ist, dass die Variable sc unten wird von einem anderen Thread geändert, bevor es in die Hash-Tabelle eingetragen wird genericTemplates Wenn also der Thread, der mit den Dallas-Informationen arbeitet, bereit ist, die Informationen in die genericTemplaes hashtable hat der Thread, der mit NewYork arbeitet, bereits die Daten geändert, die in sc um die NewYork-Daten zu reflektieren, ist jedoch mit dem Dallas-Schlüssel "recordHash" versehen. Wie Bob bin auch ich neu in der Verwendung der Lock-Anweisung und weiß nicht, wie sie wirklich funktioniert.

Mir wurde auch gesagt, dass alle Variablen, die in den Bereich des Themas fallen, nur für dieses Thema gelten. Es sind nur globale Variablen oder Objekte, die übergeben werden, auf die ich achten muss. Könnte das jemand bestätigen?

private Template EnsureGenericTemplate(Detail details, Hashtable genericTemplates)
{
    Template return_Object = null;
    SectionContainer sc = null;
    StringBuilder htmlTemplate = null;
    string recordHash = string.Format("{0}_{1}_{2}", circleNumber, zipCode, topicCd);

    lock (genericTemplates) {
        hasTemplateDefined = genericTemplates.ContainsKey(recordHash);
    {

    if (!hasTemplateDefined)
    {
        templateData = getTemplateData();

        htmlTemplate = new StringBuilder(foo1.HtmlTemplate);

        HtmlParser = hp = new HtmlParser();
        sc = hp.parseNew(htmlTemplate.ToString(), false);

        //This method merges the html template with the template data based on <tags>
        htmlTemplate = BuildTemplate(sc, htmlTemplate.ToString(), templateData);

        //This method merges the html template with the template data base on %SomeVar%
        hp.parseProperties<Detail>(ref htmlTemplate, details, false);

        //Puts the htmlTemplate into an object that hold html and text
        foo2.Html = htmlTemplate.ToString();

        lock (genericTemplates)
        {
            if (!genericTemplates.ContainsKey(recordHash))
            {
                  return_Object = new Template(foo2, sc);
                  genericTemplates.Add(recordHash, Object_For_Reuse);
            }
        }
    }  

    if (htmlTemplate == null)
    {
        lock (genericTemplates)
        {
            if (genericTemplates.ContainsKey(recordHash))
                return_Object = (Template)genericTemplates[recordHash];
        }
    }
    return return_Object;
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X