【问题标题】:C# Console App Threading?C# 控制台应用程序线程?
【发布时间】:2010-09-23 09:58:30
【问题描述】:
我即将编写一个控制台应用程序,该应用程序将在每周日凌晨 2 点运行一次。它将询问 SQL 服务器数据库,然后执行一些计算,然后将结果写入新数据库。
它正在处理数十万条记录,因此需要数小时才能完成。
我将创建一个 C# 控制台应用程序并使用 Windows 调度程序来启动它。
我的问题是:
1) 你认为这是一个好方法吗?
2) 过去,类似的控制台应用程序在不断循环时将 CPU 使用率设置为 100%。有没有正确处理线程等的好方法?
非常感谢在我开始之前的任何建议。
T
【问题讨论】:
标签:
c#
multithreading
console
【解决方案1】:
一般来说,这是一种很好的方法,因为它将 CPU 和数据密集型进程安排在非高峰/非工作时间,因此用户体验和应用程序可用性不会降低。唯一的考虑是 - 您的工作进程可能花费多少总时间?如果它将运行到 30-40 小时,那么它可能会影响周一的营业时间。
就线程而言,只有当您的计算需要一些时间并且不在数据库服务器上发生时,多线程才会有所帮助。所以在这种情况下,当一个线程正在等待来自数据库的数据时,另一个线程可能会消耗 CPU。但是,多线程意味着,您应该能够水平划分数据,以便每个线程可以处理不同的记录集。
【解决方案2】:
如果您担心您的应用在实际干扰其他用户/进程时可能会继续运行,您可以以低优先级启动该任务。这样,当其他 CPU 密集型进程运行时,您的进程将退居二线。
就多线程而言,这取决于您的情况。如果您有多个内核/cpu 可用,并且如果您能够将问题划分为并行任务,那么您可能能够利用超过 1 个线程。同时,如果您有多个内核/cpu 可用,那么您使用单线程应用程序占用所有 CPU 的风险也较小,因为其他进程只会被重定向到使用其他内核/cpu。
我使用了您安排控制台应用程序在非高峰时间执行脏活的策略。到目前为止,我还没有遇到任何问题,而且我还没有走到拆分任务和多线程的地步。
【解决方案4】:
如果您的 CPU 处于 100%,您应该使用分页和批处理来最大限度地减少您的应用程序在每个周期中所做的工作。例如,不是从数据库中获取所有记录,而是获取第一个百万,处理它,然后获取下一个百万等。
如果一个线程消耗了所有的 CPU 周期,那么创建多个线程只会增加开销。