1

定期的に何かを行うWindowsサービスがあります。ユーザーアカウントで、Windowsサービス(.netリモーティングを介して)と通信し、ユーザーにステータスといくつかのオプションを表示するsystrayアプリケーション(C#で記述)を実行します。

systrayアプリが20〜30MBのRAMを使用する以外は、すべてうまく機能します。ターミナル環境で動作する必要があります。50人のユーザーがログインすると、systrayアプリのみが1GBを超えるRAMを使用します。そして私は追加する必要はありません、それは間違っています:)

小さい.netsystrayアプリケーションを作成することは可能ですか?(最大1〜2MB?)またはc / c ++で書き込む必要がありますか?それでは、Windowsサービス(C#で記述)とsystrayアプリの間でどのような通信を使用する必要がありますか?

4

8 に答える 8

2

もう1つの考慮事項は、.NETアプリによって消費されるメモリの多くが共有(.NET)dllにあり、複数のインスタンスが実行されても複製されないことです(OSがランダム化されたdllロードアドレスを使用しない限り)。

アセンブリをGACにインストールし、を使用して事前にJITすることにより、JITコンパイルで使用されるメモリを削減することもできますngen。繰り返しますが、OSがdllロードアドレスをランダム化しない限り、これによりメモリ使用量が削減されます。

于 2010-05-20T12:10:05.870 に答える
2

コードに次の行を追加しました(アプリはGC.Collect()と一緒に呼び出すことがあります)

System.Diagnostics.Process.GetCurrentProcess().MaxWorkingSet =
                System.Diagnostics.Process.GetCurrentProcess().MinWorkingSet;

メモリ使用量が約2MB(15〜25MB)に低下し、使用後に一部のオブジェクトをヌルにした後(メニューとアイコンの描画)、メモリ使用量が約540KBに低下しました!少し大きくなります(コンテキストメニューを使用すると約2〜3 MBになりますが、その後は約540 KBに戻ります)

だから、目標は達成されました:)

于 2010-06-09T09:16:19.370 に答える
1

発生しているメモリ使用量の問題は、.NETで構築されたすべてのsys-trayアプリではなく、アプリケーションに固有である可能性があります。

アプリケーションのプロファイルを作成して、大容量のメモリ使用量が発生している場所を特定する必要があります。

于 2010-05-20T11:52:10.923 に答える
0

システムトレイアプリケーションでメモリリークが発生している可能性があります。優れたプロファイリングツールは、何が起こっているのかを理解するのに役立ちます。

于 2010-05-20T13:05:33.197 に答える
0

したがって、systrayアプリをc / c ++で作成することにした場合、Windowsサービス(C#で作成)とsystrayアプリの間でどのような通信を使用する必要がありますか?

于 2010-05-21T08:47:19.993 に答える
0

私たちは過去に同様の問題に直面しました、そして私はあなたと私の解決策を共有したいと思います。

.Net Framework TCP / IPライブラリは、悲惨なほどパフォーマンスが低く、他のライブラリと同じようにメモリを消費します。

これに対する解決策として、KODARTのXFライブラリを選択しました。.Netアプリケーション用のオープンソースの高性能TCP/IPライブラリです。複数のクライアント接続で驚くほど拡張できます。

XFライブラリを使用してTCP/IPチャネルを確立し、結果を自分で観察できます。

詳細については、この記事を確認してください。

于 2010-05-21T08:58:20.820 に答える
0

WCF(.NET 3.0または3.5?)のリリースにより、.NETリモーティングは廃止されました。WCFを使用すると、WindowsサービスでWCFサーバーをホストし、TCP/IPを介してサービスと通信するオプションがあります。私の経験では、WCFは.NETリモーティングよりもはるかに安定しています。

ServiceControllerニーズによっては、リモート処理やWCFの代わりに使用することを検討することをお勧めします。を使用ServiceControllerすると、サービスを開始および停止できます。また、を使用して、アプリケーションで定義されたコマンド(整数として)をサービスに送信することもできますService.Controller.ExecuteCommand。使用ServiceControllerは、リモート処理やWCFよりもはるかに簡単ですが、柔軟性はありません。

于 2010-05-21T09:13:49.947 に答える
0

必要なのがsystrayのアイコンの変更、ツールチップの変更、小さなコンテキストメニューの表示だけの場合は、必ず、ベアWinAPIを使用してC / C ++でsystrayアプリを作成し、パイプという名前のメッセージモードを使用してサービスと通信します。Global\複数のセッションで実行されているsystrayアプリが同じサービスに接続できるようにするには、パイプ名プレフィックスを使用することを忘れないでください。

于 2010-05-21T09:20:40.260 に答える