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

时间:2017-03-19 12:42:01

标签: c# unity3d process freeze coroutine

所以我正在编写一个程序,每十秒钟调用一个函数CloseAppList()作为协程。每次调用时,CloseAppList()都会冻结我的应用程序几秒钟。我发现,当我尝试访问.pat程序时,它会冻结程序。我也打印出大约350个进程,我认为不多。

这是我的CloseAppList()函数:

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

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

1 个答案:

答案 0 :(得分:2)

pName = p.ProcessName;出现时,我注意到 1 2 帧速率下降。这可能是在循环中创建新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答案。