2017-03-19 16 views
0

私はコルーチンとして10秒ごとにCloseAppList()関数を呼び出すプログラムを作成しています。そしてCloseAppList()は呼び出されるたびに私のアプリケーションを数秒間フリーズします。私はそれがプログラムをフリーズするp.processnameにアクセスしようとしていることを発見しました。私はまた、私はそれほど多くないと思う350のarroundですプロセスの量を印刷します。ここでC#Process.ProcessName一時的なフリーズアプリケーション

は私CloseAppList()関数です:

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

私はそれが自分のアプリケーションを凍結する方法をすることにより、非常に困惑しています。任意の提案をいただければ幸いです。 pName = p.ProcessName;が存在する場合

+0

'CloseAppList()'関数をどのように呼びますか?また、その機能のコードのいくつかを、凍結の原因を突き止めてからあなたの質問に入れるまで、コメントを下から上に付ける必要があります。 – Programmer

+0

@Programmer私はそれを10秒ごとに呼び出す別の10secupdateコルーチンからコルーチンにしました。はい、私は元の関数からコードの大部分を削除し、p.ProcessNameを使用するたびにフリーズしていることを認識しました。 – libra

答えて

2

Iは通知を約又はフレームレートの低下を行いました。これは、新しいstringオブジェクトがループ内で作成された結果と考えられます。フリーズ量は、実行中のプロセスのサイズによって異なります。

私の提案は、そのコードをThreadに移動することです。この場合、スレッドプールは正常です。 秒を待たなければならないタイマーには、coroutineを使用してください。最上部に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機能を使用すると、この関数からユニティのAPIを呼び出すことはできませんことを意味している新しいThreadに呼び出されます。 Unity APIをこの関数(別のスレッド)から呼び出す必要がある場合は、this答えを見てください。

+0

ありがとう、完璧に働いた! theres一点私は理解していませんが。なぜこれは新しい文字列オブジェクトがループ内に作成された結果でしょうか?foreachループの前に文字列の宣言を置くと思いますか? – libra

+0

私は関係ありません。文字列は不変です。 C++では文字列に似ていません。あなたがそれをすると、新しい文字列が作成されます。だから、C#に 'StringBuilder'というものがあります。私はあなたがC#の文字列についてもっと知っておくべきだと思います。 – Programmer

+1

gotcha!ありがとうございました! – libra