【问题标题】:C# Thread.Run inside For loop what is the behavior [closed]C# Thread.Run 在 For 循环内的行为是什么 [关闭]
【发布时间】:2019-03-14 23:16:46
【问题描述】:

我做一个实验,我有一个 100000 增量的循环,里面有一个执行特定任务的线程(将日志写入数据库),我的问题是当我运行它时它可能在一秒钟内完成并且它最近开始插入它们,那么操作系统如何处理它们,它将全部处理还是跳过它们? 我和他们一起尝试等待的方法,它很好。但我想知道如果此代码在服务器上并收到 100000 个请求会发生什么。 代码:

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

        }

我不是在寻找替代方法,我需要知道代码在操作系统中的行为和处理方式(如果有队列,其中一些会运行,等等)

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

【问题讨论】:

  • 同时启动 100.000 个任务是一个非常糟糕的主意。它理论上可以启动相同数量的线程,这是一个巨大的资源消耗,并且可以使系统几乎停止。您不等待任务,这很好,但是您需要考虑当无法编写时会发生什么。在这种情况下,多达 100.000 个异常可能会作为未观察到的异常发布到任务调度程序,因此可能会向用户显示这么多的错误消息。
  • 还可以处理任务并以任意顺序进行,因此您的日志到处都是。一个更好的想法是有一个专门的日志记录任务并将日志消息推送到这个任务中进行处理。对于这种生产者(提供日志条目)和消费者(输出条目)以不同速度运行并且可能有许多生产者的用例,您应该使用生产者消费者模式,请参阅docs.microsoft.com/dotnet/api/… 中的示例
  • 我知道它不好,但我们的想法是知道会发生什么,以及他们是否会去队列以将其与线程池方法进行比较。
  • @ckuri - 线程池和任务调度程序将限制这一点。这不是一个很好的方法,但你也不会得到 1000 个线程。
  • 几十个在服务器上将是一场灾难,在客户端桌面上可以忽略不计。但 I/O 可能仍在扼杀它。这一切都取决于。所以是的,使用标准日志库。

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


【解决方案1】:

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

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

变化:

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

...到:

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

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

【讨论】:

  • 我不想等待任务完成,它是一个日志。我想知道我运行代码后发生了什么。以及最佳做法是什么。
  • @MohdLom 我不相信您的代码记录了 100000 个条目。不要将await 等同于同步等待,阻塞当前线程,直到任务完成后再进行下一个任务
  • @MickyD,但在等待第一个 Task.Run 之前它不会将下一个任务排入队列,不是吗?
  • @EmrahSüngü 否。使用Task.Run 立即创建任务。通过不使用await 作为前缀,您正在创建一个fire-and-forget-task。通常这是可以的(但异常处理可能会出现问题)。但是,您需要确保您的进程不会过早退出。
  • 另一方面,我想以await为前缀询问。在await Task.Run(() =&gt; log.WriteToLog(i + "", new Models.CustomerModel.CustomerModel()));的情况下,他们都会一一运行吧?
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 2023-01-26
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多