2016-07-14 20 views
4

我想从我的quartz.net计划作业调用webapi方法。我不确定我的做法是对的吗?任何人都可以帮助,如果这是正确的方式或有没有更好的方法可用?如何从石英计划作业同步调用异步方法

MethodRepository.cs

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

石英工作:

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; 
} 
+0

的可能的复制[如何调用从C#同步方法的异步方法?(http://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method -in-c) – lorond

回答

4

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

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

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

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

此外,它似乎他们正在研究AsyncJob

+1

捕获所有异常直到你确实需要它(并且可以处理像OutOfMemoryException之类的东西)并不是一个好主意。更糟糕的是过滤并重新扔掉其中的一些或一些嵌套的。你可以用'task.GetAwaiter()。GetResult()'方法来避免这种情况,它可以帮助你摆脱'AggregateException'并且处理原始异常。 – lorond

+1

当然。只是调用Task.Result会引发AggregateException - 仅此而已。 –

6

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

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