2016-06-24 16 views
5

ich eine einfache .NET 4.5 Konsolenanwendung mit Hangfire.Core und Hangfire.SqlServer installierten Pakete haben.Mit Hangfire: generic Enqueue <T> Methode löst Ausnahme

In meinem Hauptmethode enqueue ich einen Hintergrund-Job wie folgt aus:

BackgroundJob.Enqueue<Test>((t) => Console.WriteLine(t.Sum(3,4))); 

sieht My Test Klasse wie folgt:

public class Test 
{ 
    public Test(){ } 

    public int Sum(int a, int b) 
    { 
     return a + b; 
    } 
} 

Wenn ich mein Programm F5 erhalte ich eine Ausnahme auf der Linie mit Enqueue:

„Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' aufgetreten im System .Core.dll Zusätzliche Informationen: Variable ‚t‘ von Typ ‚HangfireTest.Test‘ von Umfang verwiesen wird ‚‘, aber es ist nicht definierte neue“

Wenn ich meine Test-Klasse in Code mit erstellen‚‘ und verwenden Sie nicht generische Methode ENQUEUE - alles funktioniert:

BackgroundJob.Enqueue(() => Console.WriteLine(new Test().Sum(3,4))); 

Aber ich brauche einen generischen, Ursache ich mag würde eine Schnittstelle ITest erstellen und Dependency Injection verwenden, so etwas zu tun:

BackgroundJob.Enqueue<ITest>((t) => Console.WriteLine(t.Sum(3,4))); 

Also, was mache ich hier falsch?

+0

Es Ihre Variable 't' scheint, ist nie instanziiert. – lokusking

Antwort

2

Sie können den Rückgabewert der Hintergrundmethode nicht im Bereich der aufrufenden Methode verwenden. Diese Funktion wird nicht standardmäßig unterstützt. Sie können einen asynchronen Betrieb in Erwägung ziehen, wenn dies Ihre Anforderung ist. Es gibt eine Problemumgehung für dieses wie besprochen here.

Mit Hangfire können Sie stattdessen den Consonle.WriteLine Teil in einen separaten Job einbinden und diesen als Hintergrundjob in die Warteschlange stellen.

So könnte Ihre überarbeitete Klasse wie etwas aussehen dieser -

public class Test 
{ 
    public Test() { } 

    public int Sum(int a, int b) 
    { 
     return a + b; 
    } 

    public void SumJob(int a, int b) 
    { 
     var result = Sum(a, b); 
     Console.WriteLine(result); 
    } 
} 

... und Sie werden Arbeitsplätze jetzt einzureihen wie diese in der Lage -

BackgroundJob.Enqueue<Test>(t => t.SumJob(3, 4));