我用下面的代码片段try 了一个非常简单的Microsoft.CodeAnalysis.CSharp.Scripting测试:

var code = @"
var myList = new List<string>();
Parallel.For(0, 300, i  =>
{
    myList.Add("""" + i);
});
return myList;";

var scrOptions = ScriptOptions.Default
    .WithReferences("System", "System.Threading", "ScriptEngineTest")
    .WithImports("System", "System.Threading.Tasks", "System.Collections.Generic")
    .WithLanguageVersion(LanguageVersion.Latest);

var script = CSharpScript.Create<List<string>>(code, scrOptions);
script.Compile();
var myList = (await script.RunAsync()).ReturnValue;

代码可以很好地执行,但不会等到Paralell.For完成-我的返回列表有不同的计数,但不是全部300个项目.

这是一个错误,或者可能不是真正支持的?

提前THX

推荐答案

代码可以很好地执行,但不会等到Paralell.For完成-我的返回列表有不同的计数,但不是全部300个项目.

这并不能证明Paralell.For还没有完成.List<T>不是线程安全的,您会看到标准的race condition效果.使用thread-safe collection或将集合修改包装到lock中.

另见:

  • This answer代表"何时使用BlockingCollection,何时使用ConcurrentBag而不是List<T>?"

Csharp相关问答推荐

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

限制特定REST API不被访问,但部署代码

Quartz调度程序不调用作业(job)类

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

UWP中的任务和界面

如何在C#中使用Postman中的本地IP向本地主机上运行的本地API发出请求

取决于您的数据量的多个嵌套循环

交替的奇数

如何防止Visual Studio断点以红色突出显示到整行?

基于C#和ANGING的SignalR实时聊天流媒体应用

RX操作员使用先前值进行扫描,信号来自值本身

CRL已过期,但ChainStatus告诉我RevocationStatus未知

未显示详细信息的弹出对话框

使用Blazor WebAssembly提高初始页面加载时间的性能

我应该为C#12中的主构造函数参数创建私有属性吗?

从GRPC连接创建ZipArchive

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

最小API定义的Swagger标头参数

使用ITfoxtec.Identity.Saml2解析相同键多值SAML 2声明

C#中的逻辑运算符用作单词';is';and';and';