如何从石英计划作业同步调用异步方法

时间:2016-07-14 15:29:28

标签: c# quartz-scheduler quartz.net

我正在尝试从我的quartz.net计划工作中调用webapi方法。我不确定我的做法是否正确?如果这是正确的方法,或者有更好的方法可以帮助任何人吗?

MethodRepository.cs

public async Task<IEnumerable<ResultClass>> GetResult(string queryCriteria)
{
    return await _httpClient.Get(queryCriteria);
}

Quartz job:

public async void Execute(IJobExecutionContext context)
{
    var results= await _repo.GetResult();
}

泛型Httpclient:

public async Task<IEnumerable<T>> Get(string queryCriteria)
{
    _addressSuffix = _addressSuffix + queryCriteria;
    var responseMessage = await _httpClient.GetAsync(_addressSuffix);
    responseMessage.EnsureSuccessStatusCode();
    return await responseMessage.Content.ReadAsAsync<IEnumerable<T>>();
}

但石英文档说我不能在石英工作中使用异步方法。那么如何使用Web API方法呢?

我可以将石英作业执行方法更改为:

public void Execute(IJobExecutionContext context)
{
    var result = _repo.GetResult().Result;
}

2 个答案:

答案 0 :(得分:10)

Quartz.NET 3.0支持async / await开箱即用。所以你现在可以(而且必须)将Execute方法声明为Task返回,你可以使用async / await。

public async Task Execute(IJobExecutionContext context)
{
    var result = await _repo.GetResult();
}

答案 1 :(得分:4)

如果你必须这样做 - 那么你可以这样做,但它会阻止调用线程,直到异步操作完成。

Task.Result会将任何异常包装到AggregateException中。

所以你应该把你的httpclient调用放在try catch中。

  try
  {
      var result = _repo.GetResult().Result;
  }
  catch (AggregateException ae)
  {
      // handle exception
  }

此外,他们似乎正在处理AsyncJob