2016-03-31 12 views
0

Ich habe die folgende Wrapper-Helper-Klasse, die ich für MarkDown verwende.KeyNotFoundException in MarkDown

public static class MarkdownHelper 
{ 
    static Markdown _MarkdownTransformer; 

    static MarkdownHelper() 
    { 
     _MarkdownTransformer = new Markdown(new MarkdownOptions { AutoNewLines = true, AutoHyperlink = true, StrictBoldItalic = true }); 
    } 

    public static IHtmlString Markdown(this HtmlHelper helper, string text) 
    { 
     string html = _MarkdownTransformer.Transform(text); 

     return new MvcHtmlString(html); 
    } 
} 

Dies scheint nur in der Lage zu sein (einmal in ein paar Mal) eine Ausnahme auf dem ersten Treffer zu generieren: war Der angegebene Schlüssel nicht im Wörterbuch vorhanden:

System.Collections.Generic.KeyNotFoundException.

at System.Collections.Generic.Dictionary`2.get_Item(TKey key) 
at MarkdownSharp.Markdown.FormParagraphs(String text) 
at MarkdownSharp.Markdown.RunBlockGamut(String text) 
at MarkdownSharp.Markdown.Transform(String text) 
at AppExtensions.MarkdownHelper.Markdown(HtmlHelper helper, String text) 
[...] 

Es scheint mir ein Nebenläufigkeitsproblem. Ich verwende die neueste stabile Version von MarkDownSharp.

Muss ich ein anderes Muster für die Wrapper-Klasse?

Antwort

1

Das wahrscheinlichste Problem ist, dass Sie einen einzelnen Transformator in verschiedenen Threads verwenden. Wenn ein Thread zu transformieren beginnt, löscht ein anderer Thread den Status des Transformators und es löst sich aus. Ich habe das auch gemacht .. Oy.

Eine Möglichkeit, dies zu lösen, besteht darin, den Transformer "thread static" zu markieren und ihn in einer Eigenschaft zu initialisieren (da die Initialisierung von thread statics nur einmal inline funktioniert). Hier ist, wie das aussieht, stellen Sie sicher, dass Sie die Eigenschaft nicht direkt die statische Variable verwenden.

[ThreadStatic] private static Markdown _markdownTransformer; 

    private static Markdown Transformer 
    { 
     get 
     { 
      if (_markdownTransformer == null) 
      { 
       _markdownTransformer = new Markdown(new MarkdownOptions 
       { 
        /*your options here*/ 
       }); 
      } 

      return _markdownTransformer; 
     } 
    }