MarkDown中的KeyNotFoundException

时间:2016-03-31 12:21:31

标签: c# markdownsharp

我有以下用于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 个答案:

答案 0 :(得分:1)

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

解决此问题的一种方法是将变换器标记为“线程静态”并在属性中初始化它(因为初始化线程静态仅在内联中运行一次)。这是看起来的样子,只要确保直接使用属性而不是静态变量。

[ThreadStatic] private static Markdown _markdownTransformer;

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

            return _markdownTransformer;
        }
    }