Как лучше всего вызывать метод asyn c из Quartz. NET Job Execute? - PullRequest
0 голосов
/ 28 апреля 2020

Я конвертирую предыдущие синхронные задания Quartz. NET 2.0 в новый asyn c Quartz. NET 3.0 framework, и мне было любопытно, как лучше всего справляться с результатами вызова другого asyn c метод, для которого вам нужны результаты?

В моем сценарии я использую пакет с именем CliWrap , который предназначен для взаимодействия с исполняемыми файлами командной строки. В моем сценарии я использую их буферизованную опцию, которая записывает потоки stdout и stderr в буфер, который вы затем можете проверить.

Мой вопрос: лучше ли, чтобы задание Quartz ожидало результата от вызова CliWrap (Вариант 1 ниже), или же задание должно быть асин c и назначать JobListener? захватить буферизованный результат после завершения задания (Вариант 2 ниже)? Спасибо

Вариант 1

public Task Execute(IJobExecutionContext context) {
    MyJobDetails jobDetails = context.MergedJobDataMap["MyJobDetails"] as MyJobDetails;
    var result = Cli.Wrap(jobDetails.ExecPath))
        .WithArguments(jobDetails.Arguments)
        .ExecuteBufferedAsync();
    var r= result.GetAwaiter().GetResult();
    //do whatever with output
    string stdout = r.StandardOutput;  
    return result;
}

Вариант 2

public async Task Execute(IJobExecutionContext context) {
    MyJobDetails jobDetails = context.MergedJobDataMap["MyJobDetails"] as MyJobDetails;
    var result = await Cli.Wrap(jobDetails.ExecPath))
        .WithArguments(jobDetails.Arguments)
        .ExecuteBufferedAsync();
    //set the result in the context
    context.Result = result;
}


public class SimpleListener : IJobListener {
    public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default(CancellationToken)) {
        var result = (BufferedCommandResult)context.Result;
        //do whatever with output
        string stdout = result.StandardOutput;            
    }        
}

1 Ответ

0 голосов
/ 01 мая 2020

Вы почти никогда не должны использовать GetAwaiter().GetResult() в любом контексте. Вы блокируете поток с помощью GetAwaiter().GetResult(), и это приведет к потере всей цели async и await.

Вы должны go с вариантом 2.

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