Re: Лавинообразная сложность асинхронных методов
От: Andrey-D  
Дата: 10.04.12 21:35
Оценка:
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;
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.