リモートホストに接続し、メッセージを送信し、返信を受け取り、情報を使用するいくつかの異なる方法があります。これは、接続クラスの同じインスタンスで 2 つのメソッドを使用するまでうまくいきました。エラーが発生している例では、次のメソッドを実行します。
public string sendRequestAccountID(string siteID)
{
//build message
String response = String.Empty;
TcpClient client = new TcpClient();
client.Connect(detailsHere);
NetworkStream stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream);
writer.AutoFlush = false;
writer.WriteLine(sb.ToString());
writer.Flush();
StreamReader reader = new StreamReader(stream);
List<XmlNode> nodeList = new List<XmlNode>();
byte[] responseBytes = new byte[4096];
int bytesRead = 0;
while (true)
{
bytesRead = stream.Read(responseBytes, 0, responseBytes.Length);
if (bytesRead > 0)
{
//handle message
}
if (bytesRead == 0)
{
stream.Flush();
stream.Close();
client.Close();
string finalResponse = stuffHereToSend;
return finalResponse;
}
}
}
これは問題なく送信され、期待どおりにメッセージが返されます。ただし、接続クラスの同じインスタンスを使用し、次のメソッドを使用するとします。
public bool sendNewDevice(IDeviceInterface device)
{
NetworkStream stream;
sb = new StringBuilder();
//build message
String response = String.Empty;
TcpClient client = new TcpClient();
client.Connect(detailsHere);
stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream);
writer.AutoFlush = false;
writer.WriteLine(sb.ToString());
writer.Flush();
StreamReader reader = new StreamReader(stream);
List<XmlNode> nodeList = new List<XmlNode>();
byte[] responseBytes = new byte[4096];
int bytesRead = 0;
while (true)
{
bytesRead = stream.Read(responseBytes, 0, responseBytes.Length);
if (bytesRead > 0)
{
//handle message
}
}
}
「破棄されたオブジェクトにアクセスできません」というエラーが表示されます。
bytesRead = stream.Read(responseBytes, 0, responseBytes.Length);
最新の方法で新しくストリームを割り当てただけだと思っていましたが。以前に閉じたものを使用しようとしていますか? これを回避する方法や、私が見逃しているばかげたものはありますか?
編集:クライアントが正しく処分していないことに何か関係がありますか?2 つのメソッドは互いに 1 秒以内に実行されます。最初のメソッドが閉じる前に 2 番目のメソッドを開こうとしている可能性がありますか?