Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Quartz.NET作业执行调用异步方法的最佳实践是什么?_C#_.net_Quartz.net_Quartz.net 3.0 - Fatal编程技术网

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

C# 从Quartz.NET作业执行调用异步方法的最佳实践是什么?,c#,.net,quartz.net,quartz.net-3.0,C#,.net,Quartz.net,Quartz.net 3.0,我正在将以前的synchronous Quartz.NET 2.0作业转换为新的async Quartz.NET 3.0框架,我想知道处理调用另一个需要结果的异步方法的结果的最佳实践是什么 在我的场景中,我使用一个名为的包,用于与命令行可执行文件交互。在我的场景中,我使用了他们的buffered选项,该选项将stdout和stderr流捕获到一个缓冲区中,然后您可以检查该缓冲区 那么,我的问题是,让Quartz作业等待CliWrap调用的结果(下面的选项1)更好,还是让作业也异步并分配JobLi

我正在将以前的synchronous Quartz.NET 2.0作业转换为新的async Quartz.NET 3.0框架,我想知道处理调用另一个需要结果的异步方法的结果的最佳实践是什么

在我的场景中,我使用一个名为的包,用于与命令行可执行文件交互。在我的场景中,我使用了他们的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;            
    }        
}

您几乎不应该在任何上下文中使用
GetAwaiter().GetResult()
。您正在使用
GetAwaiter().GetResult()
阻塞线程,这将浪费
async
await
的全部功能


你应该选择选项2。

是的,我想这就是解决问题的方法。这很奇怪,因为他们的文档中有一个Execute方法,我不明白它是用async定义的还是不用async定义的?因为如果我使用wait,那么它将继续异步运行,然后在完成后将控制权返回到该块,对吗?