2016-07-14 7 views
4

私はquartz.netスケジュールジョブからwebapiメソッドを呼び出そうとしています。私のやり方が正しいかどうか分からないのですか?これが正しい方法であれば誰でも手助けできますか、より良いアプローチがありますか?quartzスケジュールジョブからasyncメソッドを同期的に呼び出す方法

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(); 
} 
関連する問題