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对投票结束的人说,因为这与编程无关:没有人这样做。是的,有一些票数接近,但不是因为这个原因。@游击队:啊,我明白了。这是误导。如果你深入到子类别中,你会发现真正的原因根本不是这样。“不保证其中的代码异步运行”听起来不对。从任务上的文档。运行:“将要在线程池上运行的指定工作排队,并返回表示该工作的任务对象。”