Пример #1
0
        public @async Invoked()
        {
            var message = new AsyncMessage(this, new object[] {});

            joiner.TryMatch(message);
            return(null);
        }
Пример #2
0
        public @async Invoked(params object[] arguments)
        {
            var message = new AsyncMessage(this, arguments);

            joiner.TryMatch(message);
            return(null);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
 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);
 }
Пример #5
0
 internal void Enqueue(AsyncMessage asyncMessage)
 {
     lock (queueLock) {
         messageQueue.Add(asyncMessage);
     }
 }