コード例 #1
0
ファイル: OneToOneLinking.cs プロジェクト: lulzzz/OrleansExp
        public override async Task Link()
        {
            if (from.Layer.Values.SelectMany(x => x).Count() != to.Layer.Values.SelectMany(x => x).Count())
            {
                throw new InvalidOperationException("OneToOne must be used between to layers with the same amount of nodes");
            }
            List <IWorkerGrain> unLinkedSender   = new List <IWorkerGrain>();
            List <IWorkerGrain> unLinkedReceiver = new List <IWorkerGrain>();

            foreach (var fromPair in from.Layer)
            {
                if (to.Layer.ContainsKey(fromPair.Key))
                {
                    var receivers = to.Layer[fromPair.Key];
                    int limit     = Math.Min(receivers.Count, fromPair.Value.Count);
                    for (int i = 0; i < limit; ++i)
                    {
                        var strategy = new OneToOne(batchSize);
                        strategy.AddReceiver(receivers[i], true);
                        await fromPair.Value[i].SetSendStrategy(id, strategy);
                    }
                    if (receivers.Count > limit)
                    {
                        unLinkedReceiver.AddRange(receivers.Skip(limit));
                    }
                    else if (fromPair.Value.Count > limit)
                    {
                        unLinkedSender.AddRange(fromPair.Value.Skip(limit));
                    }
                }
                else
                {
                    unLinkedSender.AddRange(fromPair.Value);
                }
            }
            foreach (var toPair in to.Layer)
            {
                if (!from.Layer.ContainsKey(toPair.Key))
                {
                    unLinkedReceiver.AddRange(toPair.Value);
                }
            }
            for (int i = 0; i < unLinkedReceiver.Count; ++i)
            {
                var strategy = new OneToOne(batchSize);
                strategy.AddReceiver(unLinkedReceiver[i], true);
                await unLinkedSender[i].SetSendStrategy(id, strategy);
            }
        }
コード例 #2
0
ファイル: AllToOneLinking.cs プロジェクト: lulzzz/OrleansExp
        public override async Task Link()
        {
            if (to.Layer.Values.SelectMany(x => x).Count() != 1)
            {
                throw new InvalidOperationException("AllToOne must be used when there is a n-to-1 mapping");
            }
            var dest = to.Layer.First();

            foreach (var pair in from.Layer)
            {
                foreach (IWorkerGrain grain in pair.Value)
                {
                    var strategy = new OneToOne(batchSize);
                    strategy.AddReceiver(dest.Value.First(), pair.Key.Equals(dest.Key));
                    await grain.SetSendStrategy(id, strategy);
                }
            }
        }