Как последовательно выполнять один асинхронный метод? - C#

Узнай цену своей работы

Формулировка задачи:

Как при вызове асинхронного метода не выполнять его до тех пор, пока задача, начатая при предыдущем вызове этого же метода, не будет выполнена. Пример:
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;
    }
}
Вывод может быть в совершенно разной последовательности. А мне нужно, чтобы при втором вызове AsyncCounter ожидало до окончания работы первого вызова, при третьем — окончания второго и т.д. При этом вызывающий объект (в данном случае Main) ничего не должен знать: он просто вызывает соотвествующий асинхронный метод, а вот сам метод.

Решение задачи: «Как последовательно выполнять один асинхронный метод?»

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;
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы