2016-06-24 4 views
5

मुझे एक आसान .NET 4.5 कंसोल ऐप है जिसमें हैगफायर.कोर और हैंगफायर। SQL सर्वर पैकेज स्थापित हैं।हैंगफायर का उपयोग करना: जेनेरिक एनक्यू <T> विधि अपवाद फेंकता

अपने मुख्य विधि में मैं इस तरह एक पृष्ठभूमि काम enqueue:

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

मेरे टेस्ट वर्ग इस तरह दिखता है:

public class Test 
{ 
    public Test(){ } 

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

जब मैं अपने कार्यक्रम F5 मैं के साथ लाइन पर एक अपवाद मिल एनक्यू:

"प्रकार का एक अनचाहे अपवाद 'सिस्टम। इन्वाइडऑपरेशन अपवाद' सिस्टम में हुआ .Core.dll अतिरिक्त जानकारी: प्रकार के चर 'टी' HangfireTest.Test 'गुंजाइश' से 'संदर्भित है, लेकिन यह परिभाषित नया "

जब मैं के साथ कोड में मेरे टेस्ट वर्ग बनाने" नहीं है " और गैर-सामान्य को कतारबद्ध विधि का उपयोग करें - सब कुछ काम करता है:

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

लेकिन मैं क्योंकि मैं एक अंतरफलक ITest बना सकते हैं और निर्भरता इंजेक्शन का उपयोग इस तरह कुछ करने के लिए करना चाहते हैं एक सामान्य से एक की जरूरत है,:

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

तो, मैं यहाँ क्या गलत कर रहा हूँ?

+0

ऐसा लगता है कि आपका वेरिएबल 't' है कभी तत्काल नहीं – lokusking

उत्तर

2

आप कॉलिंग विधि के दायरे में पृष्ठभूमि विधि के वापसी मूल्य का उपभोग नहीं कर सकते हैं। यह सुविधा बॉक्स के बाहर समर्थित नहीं है। यदि आप अपनी आवश्यकता है तो आप एसिंक्रोनस ऑपरेशन पर विचार कर सकते हैं। इस पर एक कार्यवाही है जैसा कि here पर चर्चा की गई है।

हैंगफायर के साथ, आप इसके बजाय क्या कर सकते हैं Consonle.WriteLine भाग को एक अलग नौकरी में लपेटें और पृष्ठभूमि नौकरी के रूप में बताएं।

तो अपने संशोधित वर्ग कुछ इस प्रकार दिखाई देंगे -

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

... और आप इस तरह अब नौकरियों enqueue में सक्षम हो जाएगा -

BackgroundJob.Enqueue<Test>(t => t.SumJob(3, 4)); 
संबंधित मुद्दे