私は、TCPClientとネットワークストリームを使ってipとportからデータを読み込むプログラムを持っています。メッセージは絶えず速いペースでプログラムに送られています。プログラムは、これらのメッセージを読み込み、メッセージを翻訳して、ユーザーにわかりやすい形式で送信される情報を表示するように設計されています。ネットワークストリームが読み込みを停止しているようですか?
これは正常に動作しているようです(約60秒間)。なんらかの理由で、それはメッセージの読み込みをやめているようです。エラーメッセージは表示されず、新しいメッセージは流れません。プログラムを停止して起動すると、1分ほど経過するまで、うまく動作します。
以下は私が使用したコードです。うまくいけば、ストリームが新しいメッセージを受け取るのを止める原因となる可能性がある間違った場所を確認できます。メインでは:case文がちょうどreleventすることはできませんので、メッセージを翻訳
private void ReadInandOutputToTextBoxIfInvoke()
{
while (true)
{
string message = "";
int x = 0;
int start = 35;
int messageLength;
int numberOfMessages;
NetworkStream nwStream = client.GetStream();
try
{
while ((x = nwStream.ReadByte()) != start) { if (x == -1) { continue; } } //if it doesnt begin with # or has gone over then break
//reads in message header which is length then number of messages
messageLength = nwStream.ReadByte();
numberOfMessages = nwStream.ReadByte();
string messageRecieved = new string(readMessage(nwStream, messageLength - 1));
string[] messages = messageRecieved.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < numberOfMessages; i++)
{
string messageToProcess = messages[i];
char messageType = messageToProcess[0];
switch (messageType)
{
case 'h':
try
{
heightMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
}
catch { }
break;
case 'l':
try
{
longWarpHeightMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
}
catch { }
break;
case 's':
try
{
status.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
}
catch { }
break;
case 'r':
try
{
calibrateMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
}
catch { }
break;
default:
break;
}
}
:
public MainWindow()
{
InitializeComponent();
client.Connect(address, port); //client, address and port are declared as public and static
connected = true;
if (connected == true)
{
readInTxtBox.Text = "Connected";
}
Thread t = new Thread(ReadInandOutputToTextBoxIfInvoke);
t.IsBackground = true;
t.Start(); //the thread is where the messages are read in
}
そして、これは方法です。
更新 - エラーを出力するために、catch文にconsole.writelineを追加しました。エラーは発生していないようです。私が作ったエディット下記をご覧ください:
switch (messageType)
{
case 'h':
try
{
heightMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
}
catch (Exception e)
{ Console.WriteLine(e.ToString()); }
break;
case 'l':
try
{
longWarpHeightMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
}
catch(Exception e) { Console.WriteLine(e.ToString()); }
break;
case 's':
try
{
status.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
}
catch(Exception e) { Console.WriteLine(e.ToString()); }
break;
case 'r':
try
{
calibrateMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
}
catch(Exception e) { Console.WriteLine(e.ToString()); }
break;
default:
break;
}
私はあなたからのエラーを隠しているそれらの空のキャッチブロックをすべて削除することで*始めるでしょう。 (何かがうまくいかない場合は、実際に問題が何も表示されていない状態で続行したいのですか?) –
ネットワークストリームの読み込みが停止しますか? –
Console.Writelineを使用して、どこから問題が発生したのかを追跡してください。また、処理する必要のある変数がある場合は、プロジェクトのパフォーマンスを監視してください。あなたのネットワークも同様です。 –