示例#1
0
文件: GlueForm.cs 项目: itadapter/nfx
        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)
                   );
        }
示例#2
0
文件: GlueForm.cs 项目: itadapter/nfx
        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)
                   );
        }