2016-07-14 8 views
4

Ich versuche, eine Webapi-Methode von meinem Quarz.net-Zeitplan-Job aufzurufen. Ich bin mir nicht sicher, ob das, was ich tue, richtig ist? Kann jemand helfen, wenn dies der richtige Weg ist oder gibt es einen besseren Ansatz?Synchron async-Methode von Quarz-Zeitplan-Job aufrufen

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(); 
} 

generic 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>>(); 
} 

Aber die Quarz-Dokumentation sagt, dass ich nicht Asynchron-Methode in einem Quarz Job verwenden können . Wie kann man dann die Web API Methode anwenden?

Kann ich die Quarz Job ausführen Methode wie:

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

Mögliches Duplikat von [Wie asynchroner Methode von synchroner Methode in C# nennen?] (Http://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method -in-c) – lorond

Antwort

4

Wenn Sie es zu tun haben - dann ja, man kann das tun, aber es wird den aufrufenden Thread blockiert, bis die asynchrone Operation abgeschlossen ist.

Task.Result wird jede Ausnahme in eine AggregateException umbrechen.

So sollten Sie wahrscheinlich Ihren httpclient-Aufruf in einen Versuch fangen.

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

Auch scheint es, dass sie an einem AsyncJob arbeiten.

+1

Es ist keine gute Idee, alle Ausnahmen zu erfassen, bis Sie sie wirklich brauchen (und etwas wie OutOfMemoryException behandeln können). Noch schlimmer ist es, einige von ihnen oder einige verschachtelte zu filtern und erneut zu werfen. Sie können dies leicht mit der 'task.GetAwaiter(). GetResult()' Methode vermeiden, die Ihnen helfen könnte, "AggregateException" loszuwerden und mit ursprünglichen Ausnahmen zu arbeiten. – lorond

+1

Sicher. Rufe nur an, dass Task.Result AggregateException auslöst - mehr nicht. –

6

Quartz.NET 3.0 unterstützt async/erwarten out of the box. Sie können (und müssen) jetzt Execute als Task deklarieren und async/await verwenden.

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