C# Process.ProcessName 临时冻结应用程序

C# Process.ProcessName temporary freeze application

所以我正在编写一个程序,每十秒调用一个函数 CloseAppList() 作为协程。每次调用 CloseAppList() 时,我的应用程序都会冻结几秒钟。我发现它是在我尝试 accessp.processname 时它冻结了程序。我还打印出进程数量约为 350,我认为这并不多。

这是我的 CloseAppList() 函数:

Process[] processes = Process.GetProcesses ();
string pName = "";
foreach (Process p in processes) {
    try{
        pName = p.ProcessName;
    }catch{
    }
}
yield return null;

我对它如何冻结我的应用程序感到非常困惑。如有任何建议,我们将不胜感激。

我确实注意到 12 当存在 pName = p.ProcessName; 时帧率下降。这可能是在循环中创建新的 string 对象的结果。冻结量的发生取决于 运行 进程的大小。

我的建议是将那段代码移动到Thread。在这种情况下,线程池就可以了。使用 coroutine 作为需要您等待 10 秒的计时器。确保在顶部包含 using System.Threading;

我这样做后没有冻结。

void Start()
{
    StartCoroutine(timedCaller());
}


IEnumerator timedCaller()
{
    WaitForSeconds waitTime = new WaitForSeconds(10);
    while (true)
    {
        //Call CloseAppList in another Thread
        ThreadPool.QueueUserWorkItem(new WaitCallback(CloseAppList));
        //Wait for 10 seconds
        yield return waitTime;
    }
}

void CloseAppList(object state)
{
    Process[] processes = Process.GetProcesses();
    string pName = "";
    foreach (Process p in processes)
    {
        try
        {
            pName = p.ProcessName;
        }
        catch
        {
        }
    }
}

注:

CloseAppList 函数将在一个新的 Thread 中被调用,这意味着您不能从该函数调用 Unity 的 API。如果您需要从此函数(另一个线程)调用 Unity API,请查看 this 答案。