c# - 从 Quartz.NET 作业执行调用异步方法的最佳实践是什么?

标签 c# .net quartz.net quartz.net-3.0

我正在将以前的同步 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() 阻塞线程,这将浪费 asyncawait 的全部用途。

您应该选择选项 2。

关于c# - 从 Quartz.NET 作业执行调用异步方法的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61482530/

相关文章:

c# - 检查表单数据是否已更改

c# - 无法使用集合初始值设定项初始化类型

.net - 我可以在 WPF 文本框中为文本的不同部分着色吗?

c# - 如何在 C# 中判断 GPS 形状是否相交?

c# - ASP.NET WEB API 启动类

使用 Excel Interop 的 C# 应用程序,在 2003 和 2007 之间轻松切换?

.net - 强制 DataGridView 提交编辑

.net - 用于在线游戏调度的 Quartz .NET

c# - 使用Quartz.NET监控Mysql表并执行一些东西

error-handling - 用什么来记录 Quartz 计划作业中的错误?