所以我正在编写一个程序,每十秒钟调用一个函数CloseAppList()作为协程。每次调用时,CloseAppList()都会冻结我的应用程序几秒钟。我发现,当我尝试访问.pat程序时,它会冻结程序。我也打印出大约350个进程,我认为不多。
这是我的CloseAppList()函数:
Process[] processes = Process.GetProcesses ();
string pName = "";
foreach (Process p in processes) {
try{
pName = p.ProcessName;
}catch{
}
}
yield return null;
我对如何冻结我的应用程序非常困惑。任何建议将不胜感激。
答案 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答案。