我的问题是关于.NET 4.6 CSharpCodeProvider
类,以及它是否是线程安全的。我有一组基于FinancvialInstrument
类的对象,这些类又生成一个C#类以计算金融产品的价值。理想情况下,我们希望并行运行这些生成的类的执行,但是这样做时会出错。以下是我们用于构建和执行生成的类的代码。源是包含C#代码的字符串
public void RunCode(string Source)
{
var cd = new CSharpCodeProvider();
CompilerParameters compiler_parameters = new CompilerParameters();
var exePath = Assembly.GetExecutingAssembly().Location;
var assemblyFolder = System.Reflection.Assembly.GetAssembly(this.GetType()).CodeBase.ToString();
assemblyFolder = Path.GetDirectoryName(assemblyFolder);
assemblyFolder = assemblyFolder.Replace(@"file:\", "");
var assemRefs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
var references = new List<string>();\\
foreach (var assemblyName in assemRefs)
references.Add(assemblyName.Name + ".dll");
foreach (var t in references)
{
var localName = Path.Combine(assemblyFolder, t);
if (File.Exists(localName))
compiler_parameters.ReferencedAssemblies.Add(localName);
}
compiler_parameters.ReferencedAssemblies.Add(exePath);
compiler_parameters.GenerateInMemory = true;
compiler_parameters.GenerateExecutable = false;
compiler_parameters.GenerateInMemory = true;
compiler_parameters.IncludeDebugInformation = true;
compiler_parameters.WarningLevel = 1;
compiler_parameters.TreatWarningsAsErrors = false;
compiler_parameters.CompilerOptions = "/optimize";
var executingAssembly = Assembly.GetExecutingAssembly();
compiler_parameters.ReferencedAssemblies.Add(executingAssembly.Location);
CompilerResults compileResults;
compileResults = cd.CompileAssemblyFromSource(compiler_parameters, Source);
}
在正常的for循环中运行时,如下所示
foreach(var source in SourceList).
RunCode(source)
一切正常,但是当我们尝试以并行方式执行代码
parralell.foreach(SourceList, x => RunCode(x));
我们在调用CompileAssemblyFromSource时收到以下错误
发生System.ArgumentException HResult = 0x80070057 消息=文件名'C:\ Users \ s.price \ AppData \ Local \ Temp \ 2 \ zrnpj1cs.0.cs'已在集合中。 参数名称:fileName 来源=系统 堆栈跟踪: 在System.CodeDom.Compiler.TempFileCollection.AddFile(字符串fileName,布尔keepFile) 在System.CodeDom.Compiler.TempFileCollection.AddExtension(String fileExtension,Boolean keepFile) 在Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters选项,String []源) 在Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters选项,String []源)
在我们看来CSharpCodeProvider可能不是线程安全的。是这种情况,如果是这样,还有其他方法可以解决这个问题吗?
感谢您的帮助
致谢
史蒂夫