次のタスクを実行するいくつかのバックグラウンド スレッドを持つ C# WPF アプリケーションを構築しました。
- while ループで実行されている TCP サーバーを含むいくつかのスレッドがあり、それぞれが特定のポートからのメッセージを待っているだけです。
- 1 つのスレッドが常に I/O デバイスの USB ポートを監視している
- 1 つのスレッドが Microsoft Kinect デバイスからデータを取得しています
- 他のスレッドから発生した「フラグ」(または静的グローバル変数) に基づいて更新を行うタイマー ディスパッチャ スレッド。
の例:
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 ではありません。
問題の私の推測は次のようになります。
- メモリ不足 (またはどこかでメモリ リークが発生しているが、Windows は正常に動作し、プログラムだけがフリーズする)
- ネットワーク ジャム (つまり、どこかでデッドロックが発生していますが、これは単純な送受信アプリケーションでは発生しそうにありません)
- USB デバイス (kinect を含む) との接続の確立に失敗しました
しかし、私はまだ問題を理解する方法がわかりません。私はまだ実装に慣れていないかもしれないので、C# WPF、ネットワーキング、マルチスレッド アプリケーションの専門家からのコメントをお待ちしております。ありがとう。