Как правильно выполнить асинхронизацию с методами синхронизации? - PullRequest
0 голосов
/ 24 октября 2019

вот моя проблема:

У меня есть два TCP-соединения. Первый контролирует только одну машину (MA), и когда он запускает процесс, больше ничего нельзя сделать, пока он не закончит свою работу. Вторые соединения управляют пятью машинами (МБ), которые могут выполнять свою работу совершенно независимо друг от друга или любого другого процесса.

Для приложения: у меня есть предупреждение базы данных, которое служит моим EventHandler для вставки в конкретную таблицу,EventHandler вызывает метод для получения вставленных данных. На основании полученных данных я хочу запустить один, два, три или все M-B или MA.

Поскольку каждый МБ может начинать следующее задание после завершения, я хотел запустить их асинхронно и MAсинхронно.

Впервые я пишу асинхронно, поэтому я хотел бы попросить помощи, чтобы направить меня в правильном направлении.

public class OracleAlertListener 
{
   public OracleAlertListener()
   {
      //Initialize the alerter
   }

   private async void Alert_OnAlert(object sender, OracleAlerterAlertEventArgs e)
   {
      Qm.Getjobs();
   }
}

public class QueueManager
{
    public void GetJobs(int jnum)
    {
        var sql = @"select * from table ...";

        /*
            Get the data into "job". "job" = a single row with command
         */

        DoWork(job);
    }

    public async void DoWork(DataRow job)
    {
        if (job["ACTION"].Equals("E"))
        {
            Task mbCommand = ProcessMBAsync(job);
            await mbCommand;
        }
        else
        {
            var result = ProcessMACommand(job);
        }
    }
    private async Task<DataRow> ProcessMBAsync(DataRow job)
    {
        await Task.Run(() =>
        {
            // Do some Work
        });
    }

    private Boolean ProcessMACommand(DataRow job)
    {
        // Do some work
    }
}

Все, что я читал об асинхронном программировании, рассказаломне не использовать void асинхронные методы. Когда я запускаю свой DoWork (задание), мне действительно не нужен его результат (также не из GetJobs (int jnum)), скорее он мне нужен из методов ProcessMBAsync и ProcessMACommand.

В ProcessMBAsync я хочуЯ знаю, какой из пяти МБ закончен и готов начать новую работу, поэтому я возвращаю DataRow, чтобы получить информацию о выполненной работе.

В ProcessMACommand я просто хочу знать, была ли работа успешной.

Итак, мой вопрос: как бы правильно построить эту процедуру?

РЕДАКТИРОВАТЬ: я имею в виду, как построить эту процедуру, чтобы я мог избежать асинхронного пустого метода. Выполните задания для MB асинхронно, а затем узнайте, какой из них завершен (поскольку MA является синхронным, и я всегда буду знать, когда он завершит работу).

AlertListener довольно устарел (он не нужен, просто удобен) и я не хочу строить эту процедуру, ориентируясь на этот Eventhandler.

Спасибо за ваши советы.

Кстати: я читал эти статьи: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/0ba7625050f975f8a7df1df57c80ad08da250541/AsyncGuidance.md и несколько других потоков на stackoverflow.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...