2016-03-31 2 views
0

У меня есть следующий вспомогательный класс оболочки, который я использую для MarkDown.KeyNotFoundException в 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); 
    } 
} 

Это только кажется, чтобы быть в состоянии генерировать (один раз в несколько раз) исключение на первый удар:

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

Мне кажется, что проблема параллелизма. Я использую последнюю стабильную версию MarkDownSharp.

Нужен ли мне другой шаблон для класса-оболочки?

ответ

1

Наиболее вероятной проблемой является то, что вы используете один трансформатор в разных потоках. Когда один поток начинает трансформироваться, другой очищает состояние трансформаторов и подбрасывает его. Я тоже это сделал. Ой.

Один из способов разрешить это только для того, чтобы пометить трансформатор «thread static» и инициализировать его в свойстве (поскольку инициализация статистики потока работает только один раз в строке). Вот как это выглядит, просто убедитесь, что напрямую используете свойство, а не статическую переменную.

[ThreadStatic] private static Markdown _markdownTransformer; 

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

      return _markdownTransformer; 
     } 
    } 
Смежные вопросы