2016-07-14 71 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(); 
}