2016-06-24 19 views
5

Ho una semplice app di console .NET 4.5 con i pacchetti Hangfire.Core e Hangfire.SqlServer installati.Utilizzo di Hangfire: metodo Encaue generico <T> genera l'eccezione

Nel mio metodo principale per cui ho Enqueue un processo in background come questo:

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

La mia classe di test si presenta così:

public class Test 
{ 
    public Test(){ } 

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

Quando ho F5 mio programma ottengo un'eccezione sulla linea con Accoda:

"Un'eccezione non gestita di tipo 'System.InvalidOperationException' si è verificata nel sistema .Core.dll Ulteriori informazioni: 't' variabile di tipo 'HangfireTest.Test' referenziato dal campo di applicazione '', ma non è definito"

quando creo la mia classe di test in codice con 'nuovo' e utilizzare il metodo Enqueue non generico - tutto funziona:

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

Ma ho bisogno di un generico, perché mi piacerebbe creare un ITest un'interfaccia e utilizzare l'iniezione di dipendenza per fare qualcosa di simile:

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

Quindi, cosa sto facendo di sbagliato qui?

+0

Sembra che il tuo 't' variabile è mai istanziato. – lokusking

risposta

2

Non è possibile utilizzare il valore restituito del metodo in background nell'ambito del metodo di chiamata. Questa funzione non è supportata immediatamente. Si può considerare un'operazione asincrona se questo è il tuo requisito. C'è una soluzione per questo come discusso here.

Con Hangfire, invece, ciò che è possibile fare è racchiudere la parte Consonle.WriteLine in un processo separato e accodarla come lavoro in background.

Quindi la classe rivisto potrebbe sembrare qualcosa di questo -

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

... e si sarà in grado di accodare i lavori ora come questo -

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