[英]Why does this Task.Run lambda run synchronously?
我正在尝试使用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();
...
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.