我有以下用于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的最新稳定版本。
我是否需要为包装类设置不同的模式?
答案 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;
}
}