[Modify] Replace it with new message process

This commit is contained in:
sta 2015-12-03 16:56:43 +09:00
parent a636653d38
commit dc533278e9

View File

@ -91,7 +91,10 @@ namespace WebSocketSharp
_handshakeRequestChecker;
private bool _ignoreExtensions;
private bool _inContinuation;
private volatile bool _inMessage;
private volatile Logger _logger;
private Action<MessageEventArgs>
_message;
private Queue<MessageEventArgs> _messageEventQueue;
private uint _nonceCount;
private string _origin;
@ -161,6 +164,7 @@ namespace WebSocketSharp
_closeContext = context.Close;
_logger = context.Log;
_message = messages;
_secure = context.IsSecureConnection;
_stream = context.Stream;
_waitTime = TimeSpan.FromSeconds (1);
@ -176,6 +180,7 @@ namespace WebSocketSharp
_closeContext = context.Close;
_logger = context.Log;
_message = messages;
_secure = context.IsSecureConnection;
_stream = context.Stream;
_waitTime = TimeSpan.FromSeconds (1);
@ -236,6 +241,7 @@ namespace WebSocketSharp
_base64Key = CreateBase64Key ();
_client = true;
_logger = new Logger ();
_message = messagec;
_secure = _uri.Scheme == "wss";
_waitTime = TimeSpan.FromSeconds (5);
@ -263,6 +269,13 @@ namespace WebSocketSharp
}
}
internal bool HasMessage {
get {
lock (_forMessageEventQueue)
return _messageEventQueue.Count > 0;
}
}
// As server
internal bool IgnoreExtensions {
get {
@ -965,6 +978,63 @@ namespace WebSocketSharp
_readyState = WebSocketState.Connecting;
}
private void message ()
{
MessageEventArgs e = null;
lock (_forMessageEventQueue) {
if (_inMessage || _messageEventQueue.Count == 0 || _readyState != WebSocketState.Open)
return;
_inMessage = true;
e = _messageEventQueue.Dequeue ();
}
_message (e);
}
private void messagec (MessageEventArgs e)
{
do {
try {
OnMessage.Emit (this, e);
}
catch (Exception ex) {
processException (ex, "An exception has occurred during an OnMessage event.");
}
lock (_forMessageEventQueue) {
if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) {
_inMessage = false;
break;
}
e = _messageEventQueue.Dequeue ();
}
}
while (true);
}
private void messages (MessageEventArgs e)
{
try {
OnMessage.Emit (this, e);
}
catch (Exception ex) {
processException (ex, "An exception has occurred during an OnMessage event.");
}
lock (_forMessageEventQueue) {
if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) {
_inMessage = false;
return;
}
e = _messageEventQueue.Dequeue ();
}
ThreadPool.QueueUserWorkItem (state => messages (e));
}
private void open ()
{
try {
@ -1500,19 +1570,10 @@ namespace WebSocketSharp
// Receive next asap because the Ping or Close needs a response to it.
receive ();
if ((frame.IsControl && !(frame.IsPing && _emitOnPing)) || !frame.IsFinal)
if (_inMessage || !HasMessage || _readyState != WebSocketState.Open)
return;
lock (_forEvent) {
try {
var e = dequeueFromMessageEventQueue ();
if (e != null && _readyState == WebSocketState.Open)
OnMessage.Emit (this, e);
}
catch (Exception ex) {
processException (ex, "An exception has occurred during an OnMessage event.");
}
}
message ();
},
ex => processException (ex, "An exception has occurred while receiving a message."));