Async await в 3-х методах C#

255
23 сентября 2018, 21:00

Мне нужно запустить в консольном приложение 3 асинхронных 3 метода. Каждый метод создает бесконечный цикл в котором обрабатывает данные из источника по API и сохраняет асинхронно в базу. Метод должен работать пока я не выключу программу. Проблема в том что запускается только первый метод, до остальных двух не доходит. В качестве проверки вывожу надпись в консоле в каждом методе. Работает только первый. Все 3 метода одинаковы на 99% разница лишь в источнике и записи в свою таблицу. Вот код в кратце без внутренних действий. Лишь цепочка вызовов.

static void Main(string[] args)
{
    FirstRobot first = new FirstRobot();
    SecondRobot second = new SecondRobot();
    ThirdRobot third = new ThirdRobot();
    first.StartFirst();
    second.StartSecond();
    third.StartThird();
}

Тут есть цепочка асинхронных методов. Во все 3х методах она одинакова. Первый метод сначала создает переменные и делает свои действия, потом внутри своего тела вызывает еще один асинхронный метод

public async Task StartFirst()
{
    await GetRobotResult(); // Тут стартует бесконечный цикл, и сюда прога возвращается после сохранения в базу.
}
async Task GetRobotResult()
{
    await robot.MyRobotTS()
}
public async Task MyRobotTS
{
    await addbaza.AddBazaMethod()
}
public async Task AddBazaMethod
{
    await db.SaveChangesAsync(); // Самый конец. Сохранение в базу.
}

Как заставить что работали сразу все 3 вечных метода?

Answer 1

Как пример, вы можете попробовать стартовать вашу, по всей видимости, синхронную работу (кода то вы так и не показали) следующим образом:

var tasks = new[]
{
    Task.Factory.StartNew(() => first.StartFirst(), TaskCreationOptions.LongRunning),
    Task.Factory.StartNew(() => first.StartFirst(), TaskCreationOptions.LongRunning),
    Task.Factory.StartNew(() => first.StartFirst(), TaskCreationOptions.LongRunning)
};
Task.WaitAll(tasks);

Тут мы стартуем 3 одинаковые работы, даем понять шедулеру, что работы долгоиграющие (он скорее всего выделит тред для каждой из работ), и после синхронно ждем когда всё это кончится.

READ ALSO
C# WPF MVVM window dragmove

C# WPF MVVM window dragmove

Есть кастомное окно, как сделать в MVVM dragmove для него? Как и где правильно забиндить mouse event?

286
Выводить дату в русскоязычном формате

Выводить дату в русскоязычном формате

В приложении aspnet core mvc в представлениях часто приходится выводить даты в кратком формате:

250
Эмуляция веб камеры

Эмуляция веб камеры

Вопрос следующий: как реализовать виртуальную веб-камеру, которую приложения (Skype, к примеру) определяли как обычную камеруИ чтобы была возможность...

259
Почему при архивации файл получается по размеру больше чем исходный файл

Почему при архивации файл получается по размеру больше чем исходный файл

Написал несколько методов, читаем частями файл, далее сжимаем его, все кладем в очередь с готовыми блоками и потом блоки пишем в файл, использую...

223