internal static IAsyncResult BeginSend(SmtpConnection conn, AsyncCallback callback, object state) { MultiAsyncResult multiResult = new MultiAsyncResult(conn, callback, state); multiResult.Enter(); IAsyncResult writeResult = conn.BeginFlush(s_onWrite, multiResult); if (writeResult.CompletedSynchronously) { conn.EndFlush(writeResult); multiResult.Leave(); } SmtpReplyReader reader = conn.Reader.GetNextReplyReader(); multiResult.Enter(); //this actually does a read on the stream. IAsyncResult result = reader.BeginReadLine(s_onReadLine, multiResult); if (result.CompletedSynchronously) { LineInfo info = reader.EndReadLine(result); if (!(multiResult.Result is Exception)) { multiResult.Result = info; } multiResult.Leave(); } multiResult.CompleteSequence(); return(multiResult); }
private void Handshake() { _connection._responseReader = new SmtpReplyReaderFactory(_connection._networkStream); SmtpReplyReader reader = _connection.Reader.GetNextReplyReader(); IAsyncResult result = reader.BeginReadLine(s_handshakeCallback, this); if (!result.CompletedSynchronously) { return; } LineInfo info = reader.EndReadLine(result); if (info.StatusCode != SmtpStatusCode.ServiceReady) { throw new SmtpException(info.StatusCode, info.Line, true); } try { if (!SendEHello()) { return; } } catch { if (!SendHello()) { return; } } }