为什么这个任务.同步执行lambda Run命令
本文关键字:lambda Run 命令 执行 同步 任务 为什么 | 更新日期: 2023-09-27 18:12:22
我试图使一些代码运行多线程使用SemaphoreSlim
和Task.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代码?
看看这里:我什么时候使用Task.Yield()?
本质上,Task.Run()
不保证其中的代码异步运行。如果你想确保你必须这样做:
Task.Run(async ()
{
await Task.Yield();
...
});