Merge pull request #6 from arthurrump/lockfix
Fix "An item with the same key has already been added." race condition
This commit is contained in:
Коммит
8d2b183ccf
|
@ -15,7 +15,7 @@ namespace ColorCode
|
|||
public CodeColorizerBase(StyleDictionary Styles, ILanguageParser languageParser)
|
||||
{
|
||||
this.languageParser = languageParser
|
||||
?? new LanguageParser(new LanguageCompiler(Languages.CompiledLanguages), Languages.LanguageRepository);
|
||||
?? new LanguageParser(new LanguageCompiler(Languages.CompiledLanguages, Languages.CompileLock), Languages.LanguageRepository);
|
||||
|
||||
this.Styles = Styles ?? StyleDictionary.DefaultLight;
|
||||
}
|
||||
|
|
|
@ -15,11 +15,10 @@ namespace ColorCode.Compilation
|
|||
private readonly Dictionary<string, CompiledLanguage> compiledLanguages;
|
||||
private readonly ReaderWriterLockSlim compileLock;
|
||||
|
||||
public LanguageCompiler(Dictionary<string, CompiledLanguage> compiledLanguages)
|
||||
public LanguageCompiler(Dictionary<string, CompiledLanguage> compiledLanguages, ReaderWriterLockSlim compileLock)
|
||||
{
|
||||
this.compiledLanguages = compiledLanguages;
|
||||
|
||||
compileLock = new ReaderWriterLockSlim();
|
||||
this.compileLock = compileLock;
|
||||
}
|
||||
|
||||
public CompiledLanguage Compile(ILanguage language)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using ColorCode.Common;
|
||||
using ColorCode.Compilation;
|
||||
using ColorCode.Compilation.Languages;
|
||||
|
@ -15,12 +16,14 @@ namespace ColorCode
|
|||
internal static readonly LanguageRepository LanguageRepository;
|
||||
internal static readonly Dictionary<string, ILanguage> LoadedLanguages;
|
||||
internal static Dictionary<string, CompiledLanguage> CompiledLanguages;
|
||||
internal static ReaderWriterLockSlim CompileLock;
|
||||
|
||||
static Languages()
|
||||
{
|
||||
LoadedLanguages = new Dictionary<string, ILanguage>();
|
||||
CompiledLanguages = new Dictionary<string, CompiledLanguage>();
|
||||
LanguageRepository = new LanguageRepository(LoadedLanguages);
|
||||
CompileLock = new ReaderWriterLockSlim();
|
||||
|
||||
Load<JavaScript>();
|
||||
Load<Html>();
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ColorCode.BasicTests
|
||||
{
|
||||
|
@ -6,18 +8,36 @@ namespace ColorCode.BasicTests
|
|||
{
|
||||
private static void Main(string[] args)
|
||||
{
|
||||
var csharpstring = "public void Method()\n{\n}";
|
||||
var formatter = new HtmlClassFormatter();
|
||||
var html = formatter.GetHtmlString(csharpstring, Languages.CSharp);
|
||||
var css = formatter.GetCSSString();
|
||||
if (args.Contains("--concurrent"))
|
||||
{
|
||||
var tasks = new Task[100];
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
tasks[i] = Task.Run(() =>
|
||||
{
|
||||
var code = "public void Method()\n{\n}";
|
||||
var formatter = new HtmlFormatter();
|
||||
var html = formatter.GetHtmlString(code, Languages.CSharp);
|
||||
Console.WriteLine(html);
|
||||
});
|
||||
}
|
||||
Task.WaitAll(tasks);
|
||||
}
|
||||
else
|
||||
{
|
||||
var csharpstring = "public void Method()\n{\n}";
|
||||
var formatter = new HtmlClassFormatter();
|
||||
var html = formatter.GetHtmlString(csharpstring, Languages.CSharp);
|
||||
var css = formatter.GetCSSString();
|
||||
|
||||
Console.WriteLine("Original:");
|
||||
Console.WriteLine(csharpstring);
|
||||
Console.WriteLine("Original:");
|
||||
Console.WriteLine(csharpstring);
|
||||
|
||||
Console.WriteLine("HTML:");
|
||||
Console.WriteLine(html);
|
||||
Console.WriteLine("HTML:");
|
||||
Console.WriteLine(html);
|
||||
|
||||
Console.ReadKey();
|
||||
Console.ReadKey();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче