public @async Invoked() { var message = new AsyncMessage(this, new object[] {}); joiner.TryMatch(message); return(null); }
public @async Invoked(params object[] arguments) { var message = new AsyncMessage(this, arguments); joiner.TryMatch(message); return(null); }
internal void TryMatch(AsyncMessage newMessage) { Chord matchedChord; SyncMessage primaryMessage = null; lock (lookupLock) { newMessage.AsyncMethod.Enqueue(newMessage); matchedChord = AsyncLookup(newMessage, ref primaryMessage); } if (matchedChord == null) { return; } if (matchedChord is SyncChord) { primaryMessage.WakeUp(); } else { (matchedChord as AsyncChord).ExecuteBody(newMessage.Arguments); } }
private Chord AsyncLookup(AsyncMessage newMessage, ref SyncMessage primaryMessage) { //we are inside a lookupLock foreach (Chord chord in asyncMethodToChords[newMessage.AsyncMethod]) { if (chord.Match()) { chord.Dequeue(ref primaryMessage, newMessage); if (chord is SyncChord) { //put some contextual info in the primary message primaryMessage.IsPrimary = true; primaryMessage.MatchingChord = chord as SyncChord; return(chord); } else { (chord as AsyncChord).ExecuteBody(newMessage.CollatedArguments.ToArray()); } } } return(null); }
internal void Enqueue(AsyncMessage asyncMessage) { lock (queueLock) { messageQueue.Add(asyncMessage); } }