0

我有以下用于 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。

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

4

1 回答 1

1

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

解决此问题的一种方法是将转换器标记为“线程静态”并在属性中对其进行初始化(因为初始化线程静态仅在内联时有效)。这是它的外观,只需确保直接使用属性而不是静态变量。

[ThreadStatic] private static Markdown _markdownTransformer;

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

            return _markdownTransformer;
        }
    }
于 2016-10-01T17:33:00.533 回答