public void Sync_JokeContract_Async_Echo_ByCode() { using (JokeHelper.MakeApp()) { var cl = new JokeContractClient(TestServerSyncNode); cl.Headers.Add(new AuthenticationHeader(TestCredentials)); var call = cl.Async_Echo("Gello B!"); var result = call.GetValue<string>(); Assert.IsTrue(result.StartsWith("Server echoed Gello B!")); } }
private void button7_Click(object sender, EventArgs e) { warmup(); var unsecure = chkUnsecureEcho.Checked; Text = "Working..."; tbNote.Text = "Started..."; var w = Stopwatch.StartNew(); var node = cbo.Text; //var totalCalls = tbCallsPerReactor.Text.AsInt(); var rcount = tbReactors.Text.AsInt(10); var prc = tbCallsPerReactor.Text.AsInt();//totalCalls / rcount; var auth = new AuthenticationHeader( new IDPasswordCredentials(tbID.Text, tbPwd.Text)); var totalCalls = rcount * prc; var calls = new ConcurrentQueue<Call>(); var derrors = new ConcurrentQueue<string>(); var tasks = new List<Task>(); for(var i=0; i<rcount; i++) { tasks.Add(Task.Factory.StartNew((idx)=> { var lcl = new JokeContractClient(node); lcl.DispatchTimeoutMs = 5 * 1000; lcl.TimeoutMs = 40 * 1000; lcl.ReserveTransport = true; if (!unsecure && chkImpersonate.Checked) lcl.Headers.Add( auth ); for(var j=0; j<prc;j++) { try { calls.Enqueue( new Call( unsecure ? lcl.Async_UnsecureEcho("Call number {0} ".Args(j)) : lcl.Async_Echo("Call number {0} ".Args(j)) )); } catch (Exception err) { derrors.Enqueue( "{0}: {1}\r\n".Args(j, err.ToMessageWithType()) ); } }//for lcl.Dispose(); }, i, TaskCreationOptions.LongRunning)); } Task.WaitAll(tasks.ToArray()); string estr = null; while(derrors.TryDequeue(out estr)) tbNote.Text += estr; var reactor = new CallReactor( calls ); var callsPlaced = w.ElapsedMilliseconds; reactor.Wait(); var stats = new ConcurrentDictionary<CallStatus, int>(); foreach(var call in reactor.Calls) { if (call.CallSlot.CallStatus==CallStatus.ResponseError) { var msg = call.CallSlot.ResponseMsg; Text = msg.ExceptionData.Message; } stats.AddOrUpdate(call.CallSlot.CallStatus, 1, (_,k)=> k+1); } var sb = new StringBuilder(); foreach(var k in stats.Keys) sb.AppendLine( "{0} = {1} times".Args(k, stats[k]) ); tbNote.Text += sb.ToString(); var allFinished = w.ElapsedMilliseconds; Text = "Placed {0:n2} calls in {1:n2} ms, then waited {2:n2} ms for finish, total time {3:n2} ms @ {4:n2} calls/sec " .Args ( totalCalls, callsPlaced, allFinished - callsPlaced, allFinished, totalCalls / (allFinished / 1000d) ); }
private void btnParallelDispatch_Click(object sender, EventArgs e) { warmup(); var unsecure = chkUnsecureEcho.Checked; var argsMarshal = chkArgsMarshalling.Checked; Text = "Working..."; tbNote.Text = "Started..."; var w = Stopwatch.StartNew(); var client = new JokeContractClient(cbo.Text); client.DispatchTimeoutMs = 5 * 1000; client.TimeoutMs = 40 * 1000; if (!unsecure && chkImpersonate.Checked) client.Headers.Add( new AuthenticationHeader( new IDPasswordCredentials(tbID.Text, tbPwd.Text)) ); var totalCalls = tbCallsPerReactor.Text.AsInt(); var calls = new ConcurrentQueue<Call>(); var derrors = new ConcurrentQueue<string>(); System.Threading.Tasks.Parallel.For(0, totalCalls, (i) => { try { calls.Enqueue( new Call( argsMarshal ? client.Async_UnsecEchoMar("Call number {0} ".Args(i)) : (unsecure ? client.Async_UnsecureEcho("Call number {0} ".Args(i)) : client.Async_Echo("Call number {0} ".Args(i)) ))); } catch (Exception err) { derrors.Enqueue( "{0}: {1}\r\n".Args(1, err.ToMessageWithType()) ); } }); string estr = null; while(derrors.TryDequeue(out estr)) tbNote.Text += estr; var reactor = new CallReactor( calls ); var callsPlaced = w.ElapsedMilliseconds; reactor.Wait(); var stats = new ConcurrentDictionary<CallStatus, int>(); foreach(var call in reactor.Calls) { if (call.CallSlot.CallStatus==CallStatus.ResponseError) { var msg = call.CallSlot.ResponseMsg; Text = msg.ExceptionData.Message; } stats.AddOrUpdate(call.CallSlot.CallStatus, 1, (_,k)=> k+1); } var sb = new StringBuilder(); foreach(var k in stats.Keys) sb.AppendLine( "{0} = {1} times".Args(k, stats[k]) ); tbNote.Text += sb.ToString(); var allFinished = w.ElapsedMilliseconds; Text = "Placed {0:n2} calls in {1:n2} ms, then waited {2:n2} ms for finish, total time {3:n2} ms @ {4:n2} calls/sec " .Args ( totalCalls, callsPlaced, allFinished - callsPlaced, allFinished, totalCalls / (allFinished / 1000d) ); }
private void btnManyParallel_Click(object sender, EventArgs e) { Text = "Working..."; var w = Stopwatch.StartNew(); var client = new JokeContractClient(cbo.Text); if (chkImpersonate.Checked) client.Headers.Add( new AuthenticationHeader( new IDPasswordCredentials(tbID.Text, tbPwd.Text)) ); var totalCalls = 0; var reactors = new List<CallReactor>(); for(int rCnt=0, n=tbReactors.Text.AsInt(); rCnt<n; rCnt++) { var calls = new List<Call>(); for(int cnt=0, m=tbCallsPerReactor.Text.AsInt(); cnt<m; cnt++) try { calls.Add( new Call( client.Async_Echo("Call number {0} from {1} reactor ".Args(cnt, rCnt) ))); } catch (Exception err) { tbNote.Text += "{0:000}:{1:00000}: {2}".Args(rCnt, cnt, err.Message); } totalCalls+=calls.Count; reactors.Add(new CallReactor(calls)); } var callsPlaced = w.ElapsedMilliseconds; CallReactor.WaitAll(reactors); var stats = new ConcurrentDictionary<CallStatus, int>(); foreach(var rtor in reactors) { foreach(var call in rtor.Calls) { if (call.CallSlot.CallStatus==CallStatus.ResponseError) { var msg = call.CallSlot.ResponseMsg; Text = msg.ExceptionData.Message; } stats.AddOrUpdate(call.CallSlot.CallStatus, 1, (_,k)=> k+1); } } var sb = new StringBuilder(); foreach(var k in stats.Keys) sb.AppendLine( "{0} = {1} times".Args(k, stats[k]) ); tbNote.Text = sb.ToString(); var allFinished = w.ElapsedMilliseconds; Text = "Placed {0} calls in {1} ms, then waited {2} ms for finish, total time {3} ms @ {4} calls/sec " .Args ( totalCalls, callsPlaced, allFinished - callsPlaced, allFinished, (1000* totalCalls) / allFinished ); }
private void btnReactor2_Click(object sender, EventArgs e) { var client1 = new JokeContractClient(cbo.Text); var client2 = new JokeContractClient(cbo.Text); new CallReactor(false, finishedReactor => { client1.Dispose(); client2.Dispose(); Invoke( (Action)( () => MessageBox.Show(finishedReactor.Context.ToString()) ) ); }, string.Empty, new Call( client1.Async_Echo("One."), (reactor, call) => reactor.Context = ((string)reactor.Context) + call.CallSlot.GetValue<string>()), new Call( client2.Async_Echo("Two."), (reactor, call) => reactor.Context = ((string)reactor.Context) + call.CallSlot.GetValue<string>()), new Call( client1.Async_Echo("Three."),(reactor, call) => reactor.Context = ((string)reactor.Context) + call.CallSlot.GetValue<string>()) ); }
private void btnReactor_Click(object sender, EventArgs e) { using(var client1 = new JokeContractClient(cbo.Text)) using (var client2 = new JokeContractClient(cbo.Text)) { var result = ""; var reactor = new CallReactor(false, new Call( client1.Async_Echo("One."), (r, call) => result += call.CallSlot.GetValue<string>()), new Call( client2.Async_Echo("Two."), (r, call) => result += call.CallSlot.GetValue<string>()), new Call( client1.Async_Echo("Three."),(r, call) => result += call.CallSlot.GetValue<string>()) ); reactor.Wait(); MessageBox.Show( result ); } }