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;
我对它如何冻结我的应用程序感到非常困惑。如有任何建议,我们将不胜感激。
我确实注意到 1 或 2 当存在 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 答案。
所以我正在编写一个程序,每十秒调用一个函数 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;
我对它如何冻结我的应用程序感到非常困惑。如有任何建议,我们将不胜感激。
我确实注意到 1 或 2 当存在 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 答案。