我正在尝试使用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代码?
答案 0 :(得分:0)
请看这里:When would I use Task.Yield()?
基本上Task.Run()
并不保证其中的代码是异步运行的。如果您想确保必须这样做:
Task.Run(async ()
{
await Task.Yield();
...
});