static public void ProcessRemoteRequest(RemoteMachine machine, ReceiveCoreActionDelegate receive, CoreAction action) { ManualResetEvent e = new ManualResetEvent(false); RequestProcessedDelegate processed = (c, r, a) => { if (c == machine.Core && (r == null || r == action)) { e.Set(); } }; machine.Core.Auditors += processed; receive(action); machine.Start(); bool result = false; while (!result) { result = e.WaitOne(100); machine.AdvancePlayback(100000); } machine.Core.Auditors -= processed; machine.Stop(); if (!result) { throw new TimeoutException("Timeout while waiting for request to process."); } }
static public CoreAction ProcessOneRequest(Core core, CoreRequest request, int timeout = 1000) { CoreRequest nextRequest = CoreRequest.RunUntil(0); CoreAction action = null; ManualResetEvent e = new ManualResetEvent(false); RequestProcessedDelegate processed = (c, r, a) => { // Advance the audio playback so RunUntil requests don't stall. core.AdvancePlayback(100000); if (c == core) { if (r == nextRequest) { e.Set(); } else if (r == request) { action = a; } } }; core.Auditors += processed; core.PushRequest(request); core.PushRequest(nextRequest); // Wait for at most one second. bool result = e.WaitOne(timeout); core.Auditors -= processed; if (!result) { throw new TimeoutException("Timeout while waiting for request to process."); } return(action); }