Как последовательно выполнять один асинхронный метод? - 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;
}
}