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