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)); }
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)); }