Я конвертирую предыдущие синхронные задания 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;
}
}