2016-08-10 5 views
0

VB .NET Framework 4を使用して構築された一連のFormsプログラムを監視するサービスを構築しました。これは、ファイル名がそれに応じて名前が変更される複数インスタンスのフォームプログラムです。フォームのプログラムが実行されていない場合、プロセスはプログラムを開始します。開いているプロセスに制限

Private Sub StartProcess(ByVal CommChannel As String, ByVal status As Integer) 
    Dim fileName As String = ServerConfig.OpcToDbFilePath & CommChannel & "\" & GetProcName(CommChannel) 
    fileName &= ".exe" 
    CopyFiles(fileName, CommChannel) 
    System.Threading.Thread.Sleep(200) 
    Try 
     If System.IO.File.Exists(fileName) Then 
      Dim opcProcess As New Process 
      Try 
       opcProcess.StartInfo.UseShellExecute = True 
       opcProcess.StartInfo.FileName = fileName 
       opcProcess.StartInfo.CreateNoWindow = True 
       opcProcess.Start() 
       System.Threading.Thread.Sleep(500) 
      Catch ex As Exception 
       ... 
      End Try 
     Else 
      ... 
    Catch ex As Exception 
     ... 
     End Try 
    End Try 
End Sub 

これは、28日のプログラムが起動した後まで、素晴らしい作品。その後、私が予期せず起動しようとしているフォームプログラムが終了します。

開けられるインスタンスの数に制限がありますか?サービスとFormsプログラムはWindows Server Datacenter 2012上で実行されています。

+0

サービスの複数のインスタンスを開いていると言っていますか?***他の多くの画面があり、1つのサービスだけで監視していますか?これは非常に幅広く(デバッグの手助けを求めています)、それは多くのことになります。見るべきコードがなければ、私たちは大いに助けにならないでしょう。この時点でゲームを推測する。閉鎖される前に質問を更新してください。 – Codexer

+0

1つのサービスと複数のフォームアプリケーション。 – DMC

+0

いいえ、ブレークポイントを設定しましたか、どんな種類のtry/catchブロックを実装して何が起こっているのかをトラップしましたか?プログラムが予期せず終了する以外は、あなたが試したことは言及していません...もしそうなら、エラーがスローされています。あなたはそれを飲み込んでいますか?***プログラムはそれを処理しています... – Codexer

答えて

1

try catchキャッチループの外で例外が発生しているようです。 winformsアプリケーションですべての例外をキャッチするには、次のようにします。

  1. プロジェクトページのUntickを有効にするアプリケーションフレームワーク。
  2. 新しい起動コードを含むモジュールを追加します。注:あなたがメインのトライキャッチループ

    Public Sub Main() 
        Try 
         AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf HandleFatalException 
         AddHandler Application.ThreadException, AddressOf HandleFatalException 
    
         Using frm As New MyForm 
          Application.Run(frm) 
         End Using 
    
        Catch ex As Exception 
         HandleFatalException(ex) 
        End Try 
    End Sub 
    
    Private Sub HandleFatalException(ex As Exception) 
        Log.Fatal("Unhandled Exception", ex) 
        MessageBox.Show(ex.Message & vbCrLf & "See log file from more details", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
        Application.Exit() 
    End Sub 
    
    Private Sub HandleFatalException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs) 
        HandleFatalException(CType(e.ExceptionObject, Exception)) 
    End Sub 
    
    Private Sub HandleFatalException(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs) 
        HandleFatalException(e.Exception) 
    End Sub 
    
+0

OK、FloatingKiwiの提案を使用した後、私はこのエラーが発生します:System.ComponentModel.Win32Exception(0x80004005):ウィンドウハンドルの作成中にエラーが発生しました。 – DMC

+0

スタックトレースを確認し、例外が常にある場所にあるかどうかを確認します。それ以外の場合は、アプリのインスタンスを1つ取ってプロファイラでデバッグしてください(私はjetbrainsのdotMemoryをお勧めします)。各インスタンスのハンドル数を見て、漏れがないことを確認してください。プロセスエクスプローラを使用してハンドル数をチェックすることもできます。 28 *カウントがMaxの近くにあるかどうかを確認してください。ハンドル数をさらに減らすための記事がたくさんあります。 – FloatingKiwi

+0

ありがとうFloatingKiwi。あなたは正しい方向に私を指摘しています。この問題を引き起こしたのがデスクトップヒープでした。 – DMC

0

の中にいるまでで説明したようにどのように多くのハンドルとGDIオブジェクトには限界があります。このモジュールにメンバ変数を初期化しない:

Pushing the Limits of Windows: Handles

Pushing the Limits of Windows: USER and GDI Objects – Part 1

Pushing the Limits of Windows: USER and GDI Objects – Part 2

これらは、開けるウィンドウ/プロセスの数に制限があります。ハンドルはアーキテクチャに基づいて異なり、GDIのデフォルトの最大数は10,000です。

デスクトップヒープのが私の問題が何であったかあったにもあります: Desktop Heap Overview

私は以前に768(3072に「ます。HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \コントロール\セッションマネージャ\サブシステム\ Windowsの」第三の数値を変更)とビオラ!マジック。

関連する問題