private static bool TryFindExistingProcess(ProjectId project, FwAppArgs args)
{
return RunOnRemoteClients(kFwRemoteRequest, requestor =>
{
ProjectMatch isMyProject;
Func<ProjectId, FwAppArgs, ProjectMatch> invoker = requestor.HandleOpenProjectRequest;
var start = DateTime.Now;
do
{
IAsyncResult ar = invoker.BeginInvoke(project, args, null, null);
while (!ar.IsCompleted)
{
s_fWaitingForUserOrOtherFw = true;
// Wait until this process knows which project it is loading.
if (!ar.AsyncWaitHandle.WaitOne(9000, false))
{
// timed out.
if (MessageBox.Show(Properties.Resources.kstidFieldWorksDidNotRespond, Properties.Resources.kstidStartupProblem,
MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
{
return true;
}
}
}
// We can now ask for the answer.
isMyProject = invoker.EndInvoke(ar);
if (isMyProject == ProjectMatch.SingleProcessMode)
{
Logger.WriteEvent("WEIRD! Detected single FW process mode while this process is trying to open a project.");
Debug.Fail("We don't think this can happen, but it's no big deal.");
return true; // Should kill this process
}
if (DateTime.Now - start > new TimeSpan(0, 0, 10))
{
// Some other process apparently keeps telling us it doesn't know. It's probably stuck in this same loop,
// waiting for us!
MessageBox.Show(Properties.Resources.kstidFieldWorksRespondedNotSure, Properties.Resources.kstidStartupProblem,
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return true; // pretends some other process has the project opened and is handling the request; this process will quit
}
} while (isMyProject == ProjectMatch.DontKnowYet);
s_fWaitingForUserOrOtherFw = false;
return (isMyProject == ProjectMatch.ItsMyProject);
});
}