繁体   English   中英

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

[英]Why does this Task.Run lambda run synchronously?

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

看一下这里: 什么时候使用Task.Yield()?

本质上Task.Run()不能保证其中的代码异步运行。 如果要确保必须执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM