public int StartJobWithProgress()

in SimpleDUTClientLibrary/RpcClient.cs [242:303]


        public int StartJobWithProgress(string command, string args, Action<string> progressCallback, Action<int> completionCallback, IPAddress localIP = null)
        {
            // setup completion listener first
            TcpListener completionListener = new TcpListener(IPAddress.Any, 0);
            completionListener.Start(1);
            var localCompletionPort = ((IPEndPoint)completionListener.LocalEndpoint).Port;

            // this task will be fired when the server connects back to the client.
            completionListener.AcceptTcpClientAsync().ContinueWith((t) =>
            {
                try
                {
                    var client = t.Result;
                    string msg;

                    using (client)
                    using (StreamReader cbReader = new StreamReader(client.GetStream()))
                    {
                        msg = cbReader.ReadToEnd();
                    }

                    // we know the message is "JOB X COMPLETED" so just split on space, and parse the middle.
                    int jobNumber = int.Parse(msg.Split(' ')[1]);
                    completionCallback?.Invoke(jobNumber);
                }
                finally
                {
                    // always close the listener - we no longer need it. 
                    completionListener.Stop();
                }
            });

            // setup progress listener next
            TcpListener progressListener = new TcpListener(IPAddress.Any, 0);
            progressListener.Start(1);
            var localProgressPort = ((IPEndPoint)progressListener.LocalEndpoint).Port;

            progressListener.AcceptTcpClientAsync().ContinueWith((t) => 
            {
                try
                {
                    var client = t.Result;
                    string msg;

                    using (client)
                    using (StreamReader progressReader = new StreamReader(client.GetStream()))
                    {
                        while ((msg = progressReader.ReadLine()) != null)
                        {
                            progressCallback?.Invoke(msg);
                        }
                    }
                }
                finally
                {
                    progressListener.Stop();
                }
            });

            var methodArgs = new object[] { localIP, localCompletionPort, localProgressPort, command, args };
            return CallRpc<int>("StartJobWithProgress", methodArgs);
        }