KeyNotFoundException in MarkDown



我有以下用于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的最新稳定版本。

我需要为包装器类使用不同的模式吗?

最可能的问题是在不同的线程中使用单个转换器。当一个线程开始转换时,另一个线程清除transformers状态并抛出。我也这么做了。。哦。

解决这个问题的一种方法是将转换器标记为"线程静态",并在属性中初始化它(因为初始化线程静态只在内联中工作一次)。下面是它的外观,只需确保直接使用属性而不是静态变量。

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

最新更新