C#Thread.Run在For循环内是什么行为

时间:2018-10-10 06:00:33

标签: c# multithreading operating-system task task-parallel-library

我做一个实验,我有一个100000增量的循环,里面有一个执行特定任务的线程(将日志写入DB),我的问题是,当我在一秒钟内完成它时,也许它开始最近插入它们,然后操作系统如何处理它们并将其全部处理或从中跳过? 我尝试与他们一起等待已久的方法。但我想知道如果此代码在服务器上并收到100000个请求,将会发生什么情况。 代码:

    for (int i = 0; i < 100000; i++)
        {
            Task.Run(() => log.WriteToLog(i + "", new Models.CustomerModel.CustomerModel()));

        }

我不是在寻找替代方法,我需要了解行为以及此代码在OS中的处理方式(如果有队列,则其中一些将运行,等等。)

PS:我知道这不是一个好方法

1 个答案:

答案 0 :(得分:2)

1秒有点快。我怀疑您正确记录了100000个条目,并且条目正在丢失

假设该代码是控制台应用程序main()中唯一的代码,那么由于您没有await任何任务,因此完全有可能在日志记录完成之前退出流程

更改:

Task.Run(() => log.WriteToLog(i + "", 
                              new Models.CustomerModel.CustomerModel()));

...至:

await Task.Run(() => log.WriteToLog(i + "", 
                                    new Models.CustomerModel.CustomerModel()));

此外,正如ckuri在评论中提到的那样,在紧密循环中产生大量任务可能不是一个好主意。考虑批量记录日志或使用IOCP。