为什么这个任务.同步执行lambda Run命令

本文关键字:lambda Run 命令 执行 同步 任务 为什么 | 更新日期: 2023-09-27 18:12:22

我试图使一些代码运行多线程使用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代码?

为什么这个任务.同步执行lambda Run命令

看看这里:我什么时候使用Task.Yield()?

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

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