使用CSharpCodeProvider时出错,线程安全吗?

时间:2018-11-04 12:21:59

标签: c# .net

我的问题是关于.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可能不是线程安全的。是这种情况,如果是这样,还有其他方法可以解决这个问题吗?

感谢您的帮助

致谢

史蒂夫

0 个答案:

没有答案