【问题标题】:C# Intentional Loop. (Low CPU Usage)C# 故意循环。 (低 CPU 使用率)
【发布时间】:2020-09-27 05:42:34
【问题描述】:

编辑: 感谢大家在这里提供答案,项目已完成。


https://github.com/0xyg3n/ProcessDaemon/


如果有人提出可能会更好的多线程解决方案,我想。


我是 C# 新手,我想问一下创建一个不会破坏你的 cpu 使用率的有意无限循环的最佳方法是什么……更像是一个守护进程。

软件的概念是: 创建一个能够确定特定进程是否正在运行的软件,以便执行代码块中断循环并再次执行循环。我知道如何扫描流程并制作循环等,但我想要一些轻量级的东西。 C# 默认情况下作为单线程运行,也许如果我将 while(true) 作为多线程来解决我的问题???

提前致谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace ProcessDaemon
{
    class Program
    {
        static void Main(string[] args)
        {

            void CP()
            {
                Process[] pname = Process.GetProcessesByName("notepad");
                if (pname.Length == 0)
                {
                    //if not running
                }
                else
                {
                    //if running
                    //break the code
                    //retry loop
                }
            }


            void cronCP()
            {
                while(true)
                {
                    CP();
                }
            }

            cronCP(); //scan the processes infinitely.
        }
    }
}

【问题讨论】:

  • 您只需要Timer
  • 好吧,计时器可以做我需要的事情,但我不想要一个计时器,因为我希望它能够即时响应。
  • 您接受的解决方案也不是立即响应的。它还将每 1 秒完成一次工作。
  • 是的,但cpu使用率真的没那么糟糕!我确实相信最好的方法是使用多线程。我只是不知道该怎么做。

标签: c# loops while-loop


【解决方案1】:

您可以将您的代码转换为异步代码,然后添加一个 Task.Delay(xx) 以在等待时释放进程

namespace ProcessDaemon
{
    class Program
    {
        static async Task Main(string[] args)
        {

            void CP()
            {
                Process[] pname = Process.GetProcessesByName("notepad");
                if (pname.Length == 0)
                {
                    //if not running
                }
                else
                {
                    //if running
                    //break the code
                    //retry loop
                }
            }


            async Task cronCP()
            {
                while (true)
                {
                    await Task.Delay(1000);
                    CP();
                }
            }

            await cronCP(); //scan the processes infinitely.
        }
    }
}

【讨论】:

  • 这会使进程轻量级吗?这是将循环作为守护进程的正确方法吗?就像在不久的将来,我可能会将它用于不同的事情,比如作为事件监听器!等待某事发生,然后触发特定操作。但是,是的,问题是这样做是否正确?
  • 异步很好,我认为进程本身可能是一个可等待的句柄或类似的,但后来我发现了这个答案stackoverflow.com/a/470288/2048821 - 好像进程类可以引发事件,所以它被制作了考虑到这一点 - 只需获取一次流程,然后响应它的事件。只需要一种方法来阻止主线程现在关闭。您可以使用 ManualResetEventSlim 来做到这一点。
猜你喜欢
  • 2023-03-27
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多