Kaynağa Gözat

2010-01-22 Atsushi Enomoto <[email protected]>

	* TcpDuplexSessionChannel.cs, PeerDuplexChannel.cs,
	  DuplexChannelBase.cs : Receive() should rather use TryReceive().
	  It should not be in reverse order.


svn path=/trunk/mcs/; revision=150040
Atsushi Eno 16 yıl önce
ebeveyn
işleme
e58a2c7a66

+ 6 - 0
mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog

@@ -1,3 +1,9 @@
+2010-01-22  Atsushi Enomoto  <[email protected]>
+
+	* TcpDuplexSessionChannel.cs, PeerDuplexChannel.cs,
+	  DuplexChannelBase.cs : Receive() should rather use TryReceive().
+	  It should not be in reverse order.
+
 2010-01-22  Atsushi Enomoto  <[email protected]>
 
 	* HttpReplyChannel.cs, HttpListenerManager.cs :

+ 8 - 11
mcs/class/System.ServiceModel/System.ServiceModel.Channels/DuplexChannelBase.cs

@@ -166,7 +166,13 @@ namespace System.ServiceModel.Channels
 			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
 
@@ -184,16 +190,7 @@ namespace System.ServiceModel.Channels
 			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
 

+ 8 - 5
mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerDuplexChannel.cs

@@ -256,15 +256,18 @@ namespace System.ServiceModel.Channels
 		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)

+ 4 - 21
mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpDuplexSessionChannel.cs

@@ -153,37 +153,20 @@ namespace System.ServiceModel.Channels
 			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)