ドキュメントにもかかわらず、NetworkStream.Writeはデータが送信されるまで待機していないようです。代わりに、データがバッファにコピーされるまで待機してから戻ります。そのバッファはバックグラウンドで送信されます。
これは私が現在持っているコードです。ns.Writeとns.BeginWriteのどちらを使用するかは関係ありません。どちらも、すぐに戻ります。EndWriteもすぐに戻ります(ネットワークへの書き込みではなく、送信バッファーへの書き込みであるため、これは理にかなっています)。
bool done;
void SendData(TcpClient tcp, byte[] data)
{
NetworkStream ns = tcp.GetStream();
done = false;
ns.BeginWrite(bytWriteBuffer, 0, data.Length, myWriteCallBack, ns);
while (done == false) Thread.Sleep(10);
}
public void myWriteCallBack(IAsyncResult ar)
{
NetworkStream ns = (NetworkStream)ar.AsyncState;
ns.EndWrite(ar);
done = true;
}
データが実際にクライアントに送信されたことをどのように確認できますか?
データを送信した後、サーバーからの応答を(たとえば)10秒間待ちたいのですが、そうでない場合は、何かが間違っていると思います。データの送信に15秒かかる場合、NetworkStream.Writeが戻ったとき(データが送信される前)からしかカウントを開始できないため、常にタイムアウトになります。データがネットワークカードを離れてから10秒のカウントを開始したいと思います。
データの量と送信時間はさまざまです。送信には1秒、送信には10秒、送信には1分かかる場合があります。サーバーはデータを受信したときに応答を送信します(SMTPサーバーです)が、データの形式が正しくなく、応答が返ってこない場合は、永遠に待ちたくないので、私がmデータが送信されるのを待っている場合、またはサーバーが応答するのを待っている場合。
ユーザーにステータスを表示したい場合があります-「サーバーにデータを送信しています」と「サーバーからの応答を待っています」を表示したいのですが、どうすればよいですか?