2016-03-31 2 views
0

J'ai la classe d'assistance wrapper suivante que j'utilise pour MarkDown.KeyNotFoundException dans 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); 
    } 
} 

Cela ne semble être en mesure de générer (une fois en plusieurs fois) une exception sur le premier coup:

System.Collections.Generic.KeyNotFoundException: La clé donnée était présent dans le dictionnaire.

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) 
[...] 

Cela me semble être un problème de concurrence. J'utilise la dernière version stable de MarkDownSharp. Ai-je besoin d'un modèle différent pour la classe d'emballage?

Répondre

1

Le problème le plus probable est que vous utilisez un seul transformateur dans différents threads. Lorsqu'un thread commence à se transformer, un autre efface l'état des transformateurs et il se lève. Je l'ai fait aussi .. Oy. Une façon de résoudre ce problème consiste simplement à marquer le «thread static» du transformateur et à l'initialiser dans une propriété (car l'initialisation de la statique du thread ne fonctionne qu'une fois en ligne). Voici à quoi cela ressemble, assurez-vous d'utiliser la propriété pas directement la variable statique.

[ThreadStatic] private static Markdown _markdownTransformer; 

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

      return _markdownTransformer; 
     } 
    }