+2010-01-22 Atsushi Enomoto <atsushi@ximian.com>
+
+ * TcpDuplexSessionChannel.cs, PeerDuplexChannel.cs,
+ DuplexChannelBase.cs : Receive() should rather use TryReceive().
+ It should not be in reverse order.
+
2010-01-22 Atsushi Enomoto <atsushi@ximian.com>
* HttpReplyChannel.cs, HttpListenerManager.cs :
return Receive (this.DefaultReceiveTimeout);
}
- public abstract Message Receive (TimeSpan timeout);
+ public virtual Message Receive (TimeSpan timeout)
+ {
+ Message msg;
+ if (!TryReceive (timeout, out msg))
+ throw new TimeoutException ();
+ return msg;
+ }
// TryReceive
return try_receive_handler.EndInvoke (out message, result);
}
- public virtual bool TryReceive (TimeSpan timeout, out Message message)
- {
- try {
- message = Receive (timeout);
- return true;
- } catch (TimeoutException) {
- message = null;
- return false;
- }
- }
+ public abstract bool TryReceive (TimeSpan timeout, out Message message);
// WaitForMessage
Queue<Message> queue = new Queue<Message> ();
AutoResetEvent receive_handle = new AutoResetEvent (false);
- public override Message Receive (TimeSpan timeout)
+ public override bool TryReceive (TimeSpan timeout, out Message message)
{
ThrowIfDisposedOrNotOpen ();
DateTime start = DateTime.Now;
- if (queue.Count > 0)
- return queue.Dequeue ();
- receive_handle.WaitOne ();
- return queue.Dequeue ();
+ if (queue.Count > 0 || receive_handle.WaitOne (timeout)) {
+ message = queue.Dequeue ();
+ return message == null;
+ } else {
+ message = null;
+ return false;
+ }
}
public override bool WaitForMessage (TimeSpan timeout)
frame.WriteSizedMessage (message);
}
- public override Message Receive ()
- {
- return Receive (DefaultReceiveTimeout);
- }
-
- public override Message Receive (TimeSpan timeout)
+ public override bool TryReceive (TimeSpan timeout, out Message message)
{
ThrowIfDisposedOrNotOpen ();
if (timeout <= TimeSpan.Zero)
throw new ArgumentException (String.Format ("Timeout value must be positive value. It was {0}", timeout));
client.ReceiveTimeout = (int) timeout.TotalMilliseconds;
- var ret = frame.ReadSizedMessage ();
+ message = frame.ReadSizedMessage ();
// FIXME: this may not be precise, but connection might be reused for some weird socket state transition (that's what happens). So as a workaround, avoid closing the session by sending EndRecord from this channel at OnClose().
- if (ret == null)
+ if (message == null) {
session = null;
- return ret;
- }
-
- public override bool TryReceive (TimeSpan timeout, out Message message)
- {
- try {
- DateTime start = DateTime.Now;
- message = Receive (timeout);
- if (message != null)
- return true;
- return false;
- } catch (TimeoutException) {
- message = null;
return false;
}
+ return true;
}
public override bool WaitForMessage (TimeSpan timeout)