gpt4 book ai didi

c# - 为什么这个 Task.Run lambda 会同步运行?

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:46 25 4
gpt4 key购买 nike

我正在尝试使用 SemaphoreSlimTask.Run() 使一些代码以多线程方式运行。

这是片段:

var semaphore = new SemaphoreSlim(50, 50);
foreach (var item in collection)
{
semaphore.Wait();

Task.Run(() =>
{
item.Property = DoTheThing(item.AnotherValue).Result;
db.SaveChanges();
semaphore.Release();
});
}

我期望发生的是 50 个任务将排队,然后 semaphore.Wait() 将启动并保持 foreach 循环直到一些任务完成并且 semaphore.Release( ) 释放线程,以便更多线程可以排队。

实际发生的是代码一个接一个地同步运行。我在这里错过了什么?我以为 Task.Run() 在新线程上启动了 lambda 代码?

最佳答案

看这里:When would I use Task.Yield()?

本质上Task.Run()不保证里面的代码异步运行。如果你想确保你必须这样做:

Task.Run(async ()
{
await Task.Yield();
...
});

关于c# - 为什么这个 Task.Run lambda 会同步运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39938244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com