예제 #1
0
        public Task <MassCalls> GetMassHandle()
        {
            var locker    = new object();
            var stopwatch = new Stopwatch();

            var massCalls = new MassCalls();

            stopwatch.Start();
            var tasks = new Dictionary <int, string>();

            var onDone = (Action <Task>)((task) => {
                lock (locker)
                {
                    massCalls.Successful++;
                    tasks[task.Id] = "success";
                }
            });
            var onFault = (Action <Task, AggregateException>)((task, aex) =>
            {
                foreach (var ex in aex.Flatten().InnerExceptions)
                {
                    Debug.WriteLine($"Exception: {ex.Message}");
                }
                lock (locker)
                {
                    massCalls.Failed++;
                    tasks[task.Id] = "fault";
                }
            });
            var onCancel = (Action <Task>)((task) =>
            {
                lock (locker)
                {
                    massCalls.Others++;
                    tasks[task.Id] = "cancel";
                }
            });
            var onOther = (Action <Task>)((task) =>
            {
                lock (locker)
                {
                    massCalls.Others++;
                    tasks[task.Id] = "other";
                }
            });

            for (var i = 0; i < 300; i++)
            {
                var actor =
                    Microsoft.ServiceFabric.Actors.Client.ActorProxy.Create <Actor1.Interfaces.IActor1>(
                        new Microsoft.ServiceFabric.Actors.ActorId(1));
                if (i % 3 == 0)
                {
                    var taskId = actor.IncreaseStateNeverFailsAsync().FireAndHandleLater(onFault: onFault, onDone: onDone, onCancel: onCancel, onOther: onOther);
                    tasks.Add(taskId, null);
                }
                if (i % 3 == 1)
                {
                    var taskId = actor.IncreaseStateFailsFirst2TimesAsync().FireAndHandleLater(onFault: onFault, onDone: onDone, onCancel: onCancel, onOther: onOther);
                    tasks.Add(taskId, null);
                }
                if (i % 3 == 2)
                {
                    var taskId = actor.IncreaseStateAlwaysFailsAsync().FireAndHandleLater(onFault: onFault, onDone: onDone, onCancel: onCancel, onOther: onOther);
                    tasks.Add(taskId, null);
                }
            }

            massCalls.ElapsedCalls = stopwatch.ElapsedMilliseconds;

            while ((massCalls.Failed + massCalls.Successful + massCalls.Others) < 300)
            {
                Task.Delay(10);
                var unhandledTasks = tasks.ToArray().Where(t => t.Value == null).ToArray();
            }
            stopwatch.Stop();
            massCalls.ElapsedResults = stopwatch.ElapsedMilliseconds;
            stopwatch.Stop();

            return(Task.FromResult(massCalls));
        }
예제 #2
0
        public Task <MassCalls> GetMassWaitAll()
        {
            var stopwatch = new Stopwatch();

            var massCalls = new MassCalls();

            stopwatch.Start();
            var tasks = new List <Task>();

            for (var i = 0; i < 300; i++)
            {
                Task task  = null;
                var  actor = Microsoft.ServiceFabric.Actors.Client.ActorProxy.Create <Actor1.Interfaces.IActor1>(new Microsoft.ServiceFabric.Actors.ActorId(1));
                if (i % 3 == 0)
                {
                    task = actor.IncreaseStateNeverFailsAsync();
                }
                if (i % 3 == 1)
                {
                    task = actor.IncreaseStateFailsFirst2TimesAsync();
                }
                if (i % 3 == 2)
                {
                    task = actor.IncreaseStateAlwaysFailsAsync();
                }
                tasks.Add(task);
            }

            try
            {
                Task.WaitAll(tasks.ToArray());
            }
            catch (AggregateException aex)
            {
                aex = aex.Flatten();
                aex.Handle(ex =>
                {
                    if (ex is NotSupportedException)
                    {
                        Debug.WriteLine($"Exception: {ex.Message}");
                        return(true);
                    }
                    else if (ex is InvalidOperationException)
                    {
                        Debug.WriteLine($"Exception: {ex.Message}");
                        return(true);
                    }
                    return(false);
                });
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Exception: {ex.Message}");
            }
            stopwatch.Stop();
            massCalls.ElapsedCalls   = stopwatch.ElapsedMilliseconds;
            massCalls.ElapsedResults = stopwatch.ElapsedMilliseconds;
            massCalls.Successful     = tasks.Count(t => t.IsCompleted && !t.IsFaulted && !t.IsCanceled);
            massCalls.Failed         = tasks.Count(t => t.IsCompleted && t.IsFaulted && !t.IsCanceled);
            massCalls.Others         = tasks.Count() - massCalls.Successful - massCalls.Failed;

            return(Task.FromResult(massCalls));
        }