1. Если есть возможность вынести эту логику в отдельный метод сервиса (этого или другого) тогда все упрощаеться до вызова одного метода и обработки результата.
2. Решение на клиенте в лоб (лучше написать или сгенерировать обертку под каждый метод):
private static AutoResetEvent _resetEvent = new AutoResetEvent(false);
private static void Main(string[] appArgs)
{
// Задача: вызывать Fun 1 и получить "n".
//
// После этого последовательны должны быть вызваны:
//
// Action2 (кроме случаев, когда "n" не делится на 2)
// Action3 (кроме случаев, когда "n" не делится на 3)
// Action4 (кроме случаев, когда "n" не делится на 4)
var service = new Service();
// Асинхронный вариант 1
var n = -1;
_resetEvent.Reset();
service.FunCompleted += (sender, args) =>
{
n = args.Argument;
_resetEvent.Set();
};
service.StartFun();
_resetEvent.WaitOne();
//или сделав обертку так
n = FunWrapper(service);
//подписка на Completed
service.Action2Completed += Service_ActionCompleted;
service.Action3Completed += Service_ActionCompleted;
service.Action4Completed += Service_ActionCompleted;
if (0 == n % 2)
{
service.StartAction2();
_resetEvent.WaitOne();
}
if (0 == n % 3)
{
service.StartAction3();
_resetEvent.WaitOne();
}
if (0 == n % 4)
{
service.StartAction4();
_resetEvent.WaitOne();
}
Console.WriteLine("Complete");
}
private static void Service_ActionCompleted(object sender, EventArgs e)
{
_resetEvent.Set();
}
private static int FunWrapper(Service service)
{
var resetEvent = new AutoResetEvent(false);
int result = -1;
service.FunCompleted += (sender, args) =>
{
result = args.Argument;
resetEvent.Set();
};
service.StartFun();
resetEvent.WaitOne();
return result;
}