从Quartz.NET Job Execute调用异步方法的最佳实践是什么?

问题描述 投票:0回答:1

我正在将以前的同步Quartz.NET 2.0作业转换为新的异步Quartz.NET 3.0框架,我很好奇,在处理调用另一个你需要结果的异步方法的结果时,最佳做法是什么?

在我的方案中,我使用了一个叫做 CliWrap 用于与命令行可执行文件交互。在我的方案中,我使用了他们的buffered选项,它可以将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;            
    }        
}
c# .net quartz.net quartz.net-3.0
1个回答
0
投票

你几乎不应该使用 GetAwaiter().GetResult() 在任何情况下。你在用 GetAwaiter().GetResult() 而这将浪费整个 asyncawait.

你应该选择方案二。

© www.soinside.com 2019 - 2024. All rights reserved.