从 Quartz.NET Job Execute 调用异步方法的最佳做法是什么?
What is best practice for calling async method from Quartz.NET Job Execute?
我正在将以前的同步 Quartz.NET 2.0 作业转换为新的异步 Quartz.NET 3.0 框架,我很好奇处理调用另一个异步方法的结果的最佳实践是什么需要结果吗?
在我的场景中,我使用了一个名为 CliWrap 的包,用于与命令行可执行文件进行交互。在我的场景中,我使用了他们的缓冲选项,该选项将 stdout 和 stderr 流捕获到一个缓冲区中,然后您可以检查该缓冲区。
那么我的问题是,让 Quartz 作业等待 CliWrap 调用的结果(下面的选项 1)更好,还是让作业也异步并分配一个 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;
}
}
您几乎不应该在任何情况下使用 GetAwaiter().GetResult()
。您正在使用 GetAwaiter().GetResult()
阻塞线程,这将浪费 async
和 await
的全部目的。
你应该选择选项 2。
我正在将以前的同步 Quartz.NET 2.0 作业转换为新的异步 Quartz.NET 3.0 框架,我很好奇处理调用另一个异步方法的结果的最佳实践是什么需要结果吗?
在我的场景中,我使用了一个名为 CliWrap 的包,用于与命令行可执行文件进行交互。在我的场景中,我使用了他们的缓冲选项,该选项将 stdout 和 stderr 流捕获到一个缓冲区中,然后您可以检查该缓冲区。
那么我的问题是,让 Quartz 作业等待 CliWrap 调用的结果(下面的选项 1)更好,还是让作业也异步并分配一个 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;
}
}
您几乎不应该在任何情况下使用 GetAwaiter().GetResult()
。您正在使用 GetAwaiter().GetResult()
阻塞线程,这将浪费 async
和 await
的全部目的。
你应该选择选项 2。