3

次のタスクを実行するいくつかのバックグラウンド スレッドを持つ C# WPF アプリケーションを構築しました。

  1. while ループで実行されている TCP サーバーを含むいくつかのスレッドがあり、それぞれが特定のポートからのメッセージを待っているだけです。
  2. 1 つのスレッドが常に I/O デバイスの USB ポートを監視している
  3. 1 つのスレッドが Microsoft Kinect デバイスからデータを取得しています
  4. 他のスレッドから発生した「フラグ」(または静的グローバル変数) に基づいて更新を行うタイマー ディスパッチャ スレッド。

の例:

    Thread thread = new Thread(new ThreadStart(Server));
    private static void Server()
    {
        try
        {
            IPAddress ipAd = IPAddress.Parse("192.168.1.119");
            // use local m/c IP address, and 
            // use the same in the client

            /* Initializes the Listener */
            TcpListener myList = new TcpListener(ipAd, 8003);

            /* Start Listeneting at the specified port */
            myList.Start();

            System.Diagnostics.Debug.Write("The server is running at port 8003...");
            System.Diagnostics.Debug.Write("The local End point is  :" +
                              myList.LocalEndpoint);
            System.Diagnostics.Debug.Write("Waiting for a connection.....");

            Socket s = myList.AcceptSocket();
            System.Diagnostics.Debug.Write("Connection accepted from " + s.RemoteEndPoint);

            byte[] b = new byte[100];
            k = s.Receive(b);
            Console.WriteLine("Recieved...");

            string temp = "";
            for (int i = 0; i < k; i++)
            {
                System.Diagnostics.Debug.Write(Convert.ToChar(b[i]));
                temp += Convert.ToChar(b[i]);
            }

            ASCIIEncoding asen = new ASCIIEncoding();
            s.Send(asen.GetBytes("The string was recieved by the server."));
            System.Diagnostics.Debug.Write("\nSent Acknowledgement");
            /* clean up */
            s.Close();
            myList.Stop();

            if (k > 0)
            {
                cont = true;
                k = 0;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Error..... " + e.StackTrace);
        }    
    }

そのため、私が遭遇した問題は、アプリケーションが時々フリーズして、まったくアクセスできないことです。メインの UI スレッドもフリーズし、Windows のタスク マネージャーからでもプログラムを強制終了できません。通常、アプリケーションは問題なく動作しますが、アプリケーションを長時間 (たとえば 4 ~ 5 時間) 使用すると、ランダムに問題が発生します。

私が使用しているコンピューターは、2G RAM と AMD デュアルコア CPU のみを搭載したハイエンド PC ではありません。

問題の私の推測は次のようになります。

  1. メモリ不足 (またはどこかでメモリ リークが発生しているが、Windows は正常に動作し、プログラムだけがフリーズする)
  2. ネットワーク ジャム (つまり、どこかでデッドロックが発生していますが、これは単純な送受信アプリケーションでは発生しそうにありません)
  3. USB デバイス (kinect を含む) との接続の確立に失敗しました

しかし、私はまだ問題を理解する方法がわかりません。私はまだ実装に慣れていないかもしれないので、C# WPF、ネットワーキング、マルチスレッド アプリケーションの専門家からのコメントをお待ちしております。ありがとう。

4

2 に答える 2

0

Visual Studio では同時実行ビジュアライザーです

私はそれを使用します(VS 2010以降は実行可能だと思います。これは、外部プロセスにアタッチすることもできます(Visual Studio Debuggerのように.

また、redgateのPerformance Profilerなどのツールの使用を検討することもできます。

于 2013-03-22T06:57:11.077 に答える
0

これをデバッグする最も簡単な方法は、デバッガーをアタッチすることです (Visual Studio でこれを実行できます)。次に、スレッドが何をしているかを見てください。VS を使用してデバッグするには、[デバッグ] -> [プロセスにアタッチ] に移動し、プロセスを選択します。それでも問題が解決しない場合は、タスク マネージャー (Windows 7 以降の場合) を使用してプロセスをダンプし、プロセスを右クリックして [ダンプ ファイルの作成] を選択します。次に、windbg または VS を使用してファイルのオフライン分析を行うことができます。見たいと思う最も有用なことは、スレッドがロックされているときにスレッドが何をしているかです。これらは、通常、この種の問題に対する最善の最初のステップです。

于 2013-03-22T03:28:56.140 に答える