我即将编写一个控制台应用程序,它将在星期日早上凌晨2点运行一周。它将询问SQL服务器数据库,然后执行一些计算,然后将结果写入新数据库。
它正在处理数十万条记录,因此需要数小时才能完成。
我将创建一个C#控制台应用程序并使用Windows调度程序启动它。
我的问题是:
1)你认为这是一个很好的方法吗? 2)过去,类似的控制台应用程序在连续循环时将CPU使用率设置为100%。是否有正确处理线程等的好方法?
在我开始之前的任何建议都将非常感激。
Ť
答案 0 :(得分:1)
一般来说,这是一个很好的方法,因为它安排了CPU&非高峰/非工作时间的数据密集型流程,因此用户体验和应用程序可用性不会降低。只考虑 - 工人流程可能需要多长时间?如果它将持续30-40小时,那么它可能会影响周一的营业时间。
就线程而言,只有当您的计算需要一些时间且数据库服务器上没有发生时,多个线程才会有所帮助。所以在这种情况下,当一个线程正在等待来自数据库的数据时,其他线程可能会占用CPU。但是,多线程意味着,您应该能够水平划分数据,以便每个线程可以在不同的记录集上工作。
答案 1 :(得分:0)
如果您担心自己的应用可能会在实际干扰其他用户/进程时继续运行,那么您只能以低优先级启动任务。这样,当其他CPU密集型进程运行时,您将退居二线。
就多线程而言,这取决于您的情况。如果您有多个内核/ cpu备用,并且如果您能够在并行任务中划分问题,那么您可以利用多个线程。同时,如果你有多个内核/ cpu备用,那么使用单线程应用程序占用所有CPU的风险也较小,因为其他进程只会被重定向到使用其他内核/ cpu。
我已经使用了安排控制台应用程序的策略来在非高峰时段进行肮脏的工作。到目前为止,我还没有遇到任何问题,而且我还没有完成分割任务和多线程的问题。
答案 2 :(得分:0)
您可以查看Tasks.Parallel课程(更多信息here)。我最近实现了类似的东西并遇到了同样的问题。幸运的是,它是一个专门的服务器来处理这个......
答案 3 :(得分:0)
如果您的CPU为100%,则应使用分页和批处理,以最大限度地减少应用程序在每个周期所做的工作。例如,不是从数据库中获取所有记录,而是获取第一个百万个,处理它,然后获取下一个百万个等等。
如果一个线程占用所有CPU周期,则创建多个线程只会增加开销。