2016-03-31 11 views
0

MarkDown için kullandığım aşağıdaki sarmalayıcı yardımcı sınıfım var.MarkDown'da KeyNotFoundException

System.Collections.Generic.KeyNotFoundException: Verilen anahtar sözlükte yer almayan

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

Bu yalnızca (birkaç kez kez) ilk hit bir özel durum oluşturmak mümkün görünüyor.

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

Bana eşzamanlılık problemi gibi geliyor. MarkDownSharp'ın en son kararlı sürümünü kullanıyorum.

Sarıcı sınıf için farklı bir desene ihtiyacım var mı?

cevap

1

En olası sorun, farklı parçacıklarda tek bir transformatör kullandığınızdır. Bir iş parçacığı dönüşmeye başladığında, bir diğeri transformatör durumunu temizler ve atar. Bunu ben de yaptım .. Oy.

Bunu çözmenin bir yolu, trafoyu "iş parçacığı statik" olarak işaretlemek ve onu bir özellikte başlatmaktır (iş parçacığı statiği başlatıldığında yalnızca satır içi bir kez çalıştığından). İşte böyle görünüyor, sadece doğrudan statik değişken değil özellik kullanmak için emin olun.

[ThreadStatic] private static Markdown _markdownTransformer; 

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

      return _markdownTransformer; 
     } 
    }