問題2回目のプロセスを実行した場合、メモリ使用量C#の増加 -- c# フィールド と memory フィールド と process フィールド 関連 問題

Problem if I run a process for second time, increase in memory usage c#












0
vote

問題

日本語

私の問題は、最初のプロセスが2秒以内に最大で実行され、約20MBを消費し、通常に戻りますが、その後プロセスを再開するたびに、1時間後に1分かかります。仕事をするために、1,200MB以上のメモリを急上昇させ、その後下げられません。 唯一の回避策は、各使用後にアプリケーションを再起動することです。

<事前> <コード> using (var compiler = new Process { StartInfo = { FileName = _installPath + @"Papyrus CompilerPapyrusCompiler.exe", Arguments = $@"{(string) tab.Tag} -f=""TESV_Papyrus_Flags.flg"" -i=""{_installPath}Datascriptssource"" -o=""{_installPath}Datascripts""", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true } }) { compiler.Start(); Console.WriteLine(compiler.StandardError.ReadToEnd()); Console.WriteLine(compiler.StandardOutput.ReadToEnd()); compiler.WaitForExit(); }

事前に助けてくれてありがとう。

編集: いくつかの変更を加えましたが、すべてを助けませんでした

<事前> <コード> using (var compiler = new Process { StartInfo = { FileName = _installPath + @"Papyrus CompilerPapyrusCompiler.exe", Arguments = $@"{tab.Tag as string} -f=""TESV_Papyrus_Flags.flg"" -i=""{_installPath}Datascriptssource"" -o=""{_installPath}Datascripts""", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true } }) { string eOut = null; compiler.ErrorDataReceived += (sender, e) => { eOut += e.Data; }; compiler.Start(); compiler.BeginErrorReadLine(); var ou = compiler.StandardOutput.ReadToEnd(); compiler.WaitForExit(); Console.WriteLine(eOut); Console.WriteLine(ou); }

また、コンソールがテキストボックスにリダイレクトされたときに言及していなかったもの

<事前> <コード> readonly TextWriter _writer; public Form1(string args) { InitializeComponent(); // Instantiate the writer _writer = new TextBoxStreamWriter(output); // Redirect the out Console stream Console.SetOut(_writer); }
英語

My problem is that the first process get executed in max under a second and will consume about 20MB and will come down back to normal, but every time I restart the process after that, even an hours later it will take about 1 minute to do the work and will spike the memory over 1,200MB and will not go down after that. The only workaround is to restart the application after each use.

using (var compiler = new Process                         {                             StartInfo =                             {                                 FileName = _installPath + @"Papyrus CompilerPapyrusCompiler.exe",                                 Arguments = $@"{(string) tab.Tag} -f=""TESV_Papyrus_Flags.flg"" -i=""{_installPath}Datascriptssource"" -o=""{_installPath}Datascripts""",                                 UseShellExecute = false,                                 RedirectStandardOutput = true,                                 RedirectStandardError = true,                                 CreateNoWindow = true                             }                         })                         {                             compiler.Start();                              Console.WriteLine(compiler.StandardError.ReadToEnd());                             Console.WriteLine(compiler.StandardOutput.ReadToEnd());                              compiler.WaitForExit();                         } 

Thank's for the help in advance.

Edit: Made a few change but didn't help at all

using (var compiler = new Process                     {                         StartInfo =                         {                             FileName = _installPath + @"Papyrus CompilerPapyrusCompiler.exe",                             Arguments = $@"{tab.Tag as string} -f=""TESV_Papyrus_Flags.flg"" -i=""{_installPath}Datascriptssource"" -o=""{_installPath}Datascripts""",                             UseShellExecute = false,                             RedirectStandardOutput = true,                             RedirectStandardError = true,                             CreateNoWindow = true                         }                     })                     {                         string eOut = null;                         compiler.ErrorDataReceived += (sender, e) =>                         {                             eOut += e.Data;                         };                          compiler.Start();                          compiler.BeginErrorReadLine();                         var ou = compiler.StandardOutput.ReadToEnd();                          compiler.WaitForExit();                          Console.WriteLine(eOut);                         Console.WriteLine(ou);                     } 

Also the thing I didn't mention the first time the console is redirect to a textbox

        readonly TextWriter _writer;      public Form1(string args)     {         InitializeComponent();          // Instantiate the writer         _writer = new TextBoxStreamWriter(output);         // Redirect the out Console stream         Console.SetOut(_writer);     } 
</div
        

回答リスト

0
 
vote
vote
ベストアンサー
 

長い間、私の髪の毛を搾り切れば、問題を解決するために何か他のものを試すことにしました。 このメソッドのみを使用して新しいアプリケーションを作成し、ボタンをクリックしてスクリプトをコンパイルしようとした2番目の試みにハングアップします。私の驚きは問題がなくなったということでした。

元のアプリケーションからさらに多くのアクションを追加することで、私のエラーを再現しようとしました。すぐに私はOutput.Clear()を追加しました。それはハングアップし始めました、問題が見つかりました

私はoutput.text = ""をしようとしました。そしてそれはまだハングアップし始めます。

 

After so long and puling my hair of I decided to try something else to resolve the problem. I created a new application with only this method with a button click to test if it would hang on the second attempt to compile the script. My surprise was that the problem was gone.

I decide then to try to reproduce my error by adding a few more actions from the original application. As soon I added the output.Clear(); it started to hang, problem found

I also tried to do output.Text = ""; and it will still started to hang.

</div
 
 

関連する質問

1  getExitCodeProcess()は128を返します  ( Getexitcodeprocess returns 128 ) 
私は、サードパーティの親プロセスに拡張子としてロードされているDLLを持っています。このDLLから、CreateProcess APIを使用して外部プロセス(自分の)をインスタンス化します。これは、ケースの99.999%では素晴らしい機能ですが、これは突然故障...

5  なぜ.exeは止まるのを拒否しますか?  ( Why does exe refuse to stop ) 
デバッグしなければならない従来のC#/ C ++プログラムを「継承」しました。現在の問題は、プログラムを閉じた後に.exeが停止しないことです。これはまだタスクマネージャに表示されます。 これは問題であるため、インスタンスが1つだけ実行できるため、プログラムを...

1  実行中のプログラムを使用してWin32デスクトップを削除してそれらのプログラムを終了させるにはどうすればよいですか。  ( How can i delete a win32 desktop with running programs and terminate those prog ) 
このコードを持っています: <事前> <コード> #define _WIN32_WINNT 0x0500 #include <cstdlib> #include <iostream> #include <windows.h> using namespace ...

4  トップ&httpd - 実際に稼働していることを分解します  ( Top httpd demystifying what is actually running ) 
私はしばしば「TOP」コマンドを使ってリソースを取り上げているものを見ることができます。ほとんどはApache httpdプロセスの長いリストがあります。これはあまり役に立ちません。同様のリストを見る方法はありますが、どのPHPスクリプトなどが実際に実行されて...

4  Exec Family  ( The exec family ) 
プロジェクトは、EXECファミリの使用が必要です。私のプロジェクトは対話型シェルを作ることから成ります。シェルはCD、LS、エコーなどのようないくつかの基本的なコマンドを実装します。私はexecの使用を調査していますが、有用なサイトを見つけていません。提案され...

0  NETプロセス/スレッドが予期せず終了させることができるのは何ですか?  ( What can cause a net process thread to terminate unexpectedly ) 
main()メソッドがtry ... catch句で保護されていても、.NETプロセスまたはスレッドが終了する理由の完全なリストを集めようとしています。 そのような理由の1つはthread.abort()です(Thread.Resetabortを呼び出しない...

0  NETでプロセス情報を取得する  ( Getting process information in net ) 
この質問。 更新 - これは正確な重複ではありません。私の解決策を見てください。 Process Explorerでjava.exeプロセスを表示し、ダブルクリックすると、作業ディレクトリとアンプが表示されます。コマンドライン引数を開始します。 ...

35  Windowsサービス内からProcess.Start()を使用して別のユーザーとしてプロセスを開始する  ( Using process start to start a process as a different user from within a windo ) 
Windowsサービスから指定されたユーザーアカウントで任意の.NET EXEを定期的に実行します。 これまでのところ、ターゲットプロセスが何であるか、および実行するときにロジックで実行されているWindowsサービスを実行しました。 ターゲットプロセスは...

16  プロセスがDelphiを使用して実行されているかどうかを確認する方法  ( How to check if a process is running using delphi ) 
この質問に似ていますが、Delphi: どうやってI.プロセスがすでにC#を使用して実行されているかどうかを調べてください。 アップデータプログラムを持っています、私はそれが現在実行されていないプログラムをチェックしてほしい、現在のユーザーだけでなく、すべ...

755  アプリケーションまたはプロセスの実際のメモリ使用量を測定する方法  ( How can i measure the actual memory usage of an application or process ) 
この質問は、ここ Linuxのアプリケーションまたはプロセスのメモリ使用量をどのように測定しますか? メモリの理解Linux 、<コード> ps は、この意図に使用する正確なツールではありません。 なぜ<コード> ps は「間違っている」 で...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有