我有以下用于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。
我需要为包装器类使用不同的模式吗?
发布于 2016-10-02 01:33:01
最有可能的问题是,您在不同的线程中使用单个转换器。当一个线程开始转换时,另一个线程清除转换器状态并抛出异常。我也是这样做的..哇哦。
解决这个问题的一种方法是将转换器标记为"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;
}
}https://stackoverflow.com/questions/36333364
复制相似问题