2016-03-31 4 views
0

MarkDownに使用する以下のラッパーヘルパークラスがあります。MarkDownのKeyNotFoundException

System.Collections.Generic.KeyNotFoundException:指定されたキーが辞書に存在していなかった

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

これは(数回に1回)最初のヒットに例外を生成することができるようです。

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

私には並行性の問題があるようです。私はMarkDownSharpの最新の安定版を使用しています。

ラッパークラスに別のパターンが必要ですか?

答えて

1

最も可能性のある問題は、異なるスレッドで1つのトランスを使用していることです。 1つのスレッドが変換を開始すると、別のスレッドが変圧器の状態をクリアし、それがスローアップします。私もこれをやった。オイ。

これを解決する方法の1つは、変圧器「thread static」をマークしてプロパティで初期化することです(スレッド統計の初期化はインラインで1回しか機能しないためです)。それはどのように見えますか、静的変数ではなくプロパティを直接使用するようにしてください。

[ThreadStatic] private static Markdown _markdownTransformer; 

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

      return _markdownTransformer; 
     } 
    }