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