为什么这个Task.Run lambda同步运行?

时间:2016-10-08 22:59:43

标签: c# .net asynchronous

我正在尝试使用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代码?

1 个答案:

答案 0 :(得分:0)

请看这里:When would I use Task.Yield()?

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

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