Как последовательно выполнять один асинхронный метод? - C#
Формулировка задачи:
Как при вызове асинхронного метода не выполнять его до тех пор, пока задача, начатая при предыдущем вызове этого же метода, не будет выполнена. Пример:
Вывод может быть в совершенно разной последовательности. А мне нужно, чтобы при втором вызове AsyncCounter ожидало до окончания работы первого вызова, при третьем — окончания второго и т.д. При этом вызывающий объект (в данном случае Main) ничего не должен знать: он просто вызывает соотвествующий асинхронный метод, а вот сам метод.
class Program { static void Main(string[] args) { for (int i = 0; i < 3; i++) { AsyncCounter(i); } Console.Read(); } private static async void AsyncCounter(int val) { int value = await Task.Factory.StartNew(() => Counter(val)); Console.WriteLine("Переданное значение: {0}{2}Вычисленное значение: {1}", val, value, Environment.NewLine); } static int Counter(int start) { for (int i = 0; i < 10; i++) { start++; Thread.Sleep(150); } return start; } }
Решение задачи: «Как последовательно выполнять один асинхронный метод?»
textual
Листинг программы
class Program { static Semaphore sem; static void Main(string[] args) { sem = new Semaphore(1, 1); for (int i = 0; i < 3; i++) { AsyncCounter(i); } Console.Read(); } private static async void AsyncCounter(int val) { sem.WaitOne(); int value = await Task.Factory.StartNew(() => Counter(val)); sem.Release(); Console.WriteLine("Переданное значение: {0}{2}Вычисленное значение: {1}", val, value, Environment.NewLine); } static int Counter(int start) { for (int i = 0; i < 10; i++) { start++; Thread.Sleep(150); } return start; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д