如何从石英计划作业同步调用异步方法
How to synchronously call async method from quartz schedule job
我正在尝试从我的 quartz.net 计划作业中调用 webapi 方法。我不确定我这样做的方式是否正确?如果这是正确的方法或有更好的方法可用,谁能提供帮助?
MethodRepository.cs
public async Task<IEnumerable<ResultClass>> GetResult(string queryCriteria)
{
return await _httpClient.Get(queryCriteria);
}
Quartz 作业:
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>>();
}
但是 quartz 文档说我不能在 quartz 作业中使用异步方法。那么Web API 方法如何呢?
我可以将 quartz 作业执行方法更改为:
public void Execute(IJobExecutionContext context)
{
var result = _repo.GetResult().Result;
}
如果您必须这样做 - 那么是的,您可以这样做,但它会阻塞调用线程,直到异步操作完成。
Task.Result 会将任何异常包装到 AggregateException 中。
所以您可能应该将您的 httpclient 调用放在 try catch 中。
try
{
var result = _repo.GetResult().Result;
}
catch (AggregateException ae)
{
// handle exception
}
此外,他们似乎正在研究 AsyncJob。
Quartz.NET 3.0 支持开箱即用的 async/await。所以你现在可以(而且必须)将 Execute 方法声明为 Task 返回,你可以使用 async/await.
public async Task Execute(IJobExecutionContext context)
{
var result = await _repo.GetResult();
}
我正在尝试从我的 quartz.net 计划作业中调用 webapi 方法。我不确定我这样做的方式是否正确?如果这是正确的方法或有更好的方法可用,谁能提供帮助?
MethodRepository.cs
public async Task<IEnumerable<ResultClass>> GetResult(string queryCriteria)
{
return await _httpClient.Get(queryCriteria);
}
Quartz 作业:
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>>();
}
但是 quartz 文档说我不能在 quartz 作业中使用异步方法。那么Web API 方法如何呢?
我可以将 quartz 作业执行方法更改为:
public void Execute(IJobExecutionContext context)
{
var result = _repo.GetResult().Result;
}
如果您必须这样做 - 那么是的,您可以这样做,但它会阻塞调用线程,直到异步操作完成。
Task.Result 会将任何异常包装到 AggregateException 中。
所以您可能应该将您的 httpclient 调用放在 try catch 中。
try
{
var result = _repo.GetResult().Result;
}
catch (AggregateException ae)
{
// handle exception
}
此外,他们似乎正在研究 AsyncJob。
Quartz.NET 3.0 支持开箱即用的 async/await。所以你现在可以(而且必须)将 Execute 方法声明为 Task 返回,你可以使用 async/await.
public async Task Execute(IJobExecutionContext context)
{
var result = await _repo.GetResult();
}