C# 为什么此Task.Run lambda同步运行?

C# 为什么此Task.Run lambda同步运行?,c#,.net,asynchronous,C#,.net,Asynchronous,我正在尝试使用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

我正在尝试使用
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.Run()
不能保证其中的代码异步运行。如果您想确保必须这样做:

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

Task.Run()
返回一个您没有等待的
Task
对象。@Guerrilla:我对此还是新手,但我认为您可能需要创建一个任务数组,然后在该数组上使用
Task.WhenAll()
。您可以在lambda.Lol中对投票关闭的人进行信号量等待,因为这与编程无关。我设法弄明白了,文档没有在示例中显示这一点,但需要像调用
Task.Run(async()=>{lambda})一样调用它
Lol对投票结束的人说,因为这与编程无关:没有人这样做。是的,有一些票数接近,但不是因为这个原因。@游击队:啊,我明白了。这是误导。如果你深入到子类别中,你会发现真正的原因根本不是这样。“不保证其中的代码异步运行”听起来不对。从任务上的文档。运行:“将要在线程池上运行的指定工作排队,并返回表示该工作的任务对象。”