2012-03-21 15 views
5

पर कक्षा के तरीकों को सशर्त रूप से चलाएं मेरे पास एक कक्षा है जो डेटाबेस में लॉगिंग जानकारी सहेजती है (NServiceBus संदेश Handle विधि में)।एक अलग थ्रेड

मुख्य प्रक्रिया से लॉगिंग को अलग थ्रेड (और लेनदेन) पर किया जा सकता है। लेकिन यह सब एक ही पृष्ठभूमि धागे पर किया जाना चाहिए (जिसका अर्थ है कि उन्हें क्रम में किया जाना चाहिए, केवल मुख्य प्रक्रिया के साथ सिंक में नहीं)।

हालांकि, एक बार जब यह NServiceBus से वास्तविक डेटा की विदेशी कुंजीिंग शुरू करता है, तो उसे एक ही थ्रेड पर होना आवश्यक है। अगर वहाँ मेरे लेनदेन सशर्त उपयोग करने के लिए भी सशर्त एक अलग धागा करने के लिए चल रहा है स्थानांतरित करने के लिए एक रास्ता है

public class MyExample 
{ 

    public void LogSomeStuff(Stuff stuff) 
    { 
     using (MoveOutsideTransaction()) 
     { 
     // Do Method Stuff here 
     dataAccess.SaveChanges(); 
     } 
    } 


    public void LogSomeOtherStuff(Stuff stuff) 
    { 
     using (MoveOutsideTransaction()) 
     { 
     // Do Other Method Stuff here 
     dataAccess.SaveChanges(); 
     } 
    } 

    private IDisposable MoveOutsideTransaction() 
    { 
     if (loggingOutsideTransaction) 
      return new TransactionScope(TransactionScopeOption.Suppress); 

     return null; 
    } 
} 

मैं सोच रहा हूँ:

यहाँ कुछ उदाहरण कोड है। (लेकिन केवल जब यह लेन-देन को रोकता है।)

उत्तर

2

अगर वहाँ भी सशर्त एक अलग धागा करने के लिए चल रहा है के लिए कदम मेरे लेनदेन को सशर्त उपयोग करने के लिए एक रास्ता है मैं सोच रहा हूँ।

आप किसी विधि के निष्पादन को किसी भिन्न थ्रेड पर नहीं ले जा सकते हैं। थ्रेड सामान्य रूप से इस तरह से काम नहीं करते हैं। हालांकि, आप क्या कर सकते हैं एक समर्पित थ्रेड स्थापित करना जो एक मार्शलिंग ऑपरेशन में भाग ले सकता है जो वैसे भी कम या ज्यादा करता है, निष्पादन के हस्तांतरण को किसी अन्य थ्रेड पर अनुकरण करता है। घर को इस बिंदु पर ड्राइव करना महत्वपूर्ण है कि इस समर्पित धागे को विशेष रूप से इस मार्शलिंग ऑपरेशन को स्वीकार करने के लिए कोड किया जाना चाहिए।

यहां बताया गया है कि यह कैसे काम करता है।

public class DedicatedThread 
{ 
    private BlockingCollection<Action> actions = new BlockingCollection<Action>(); 

    public DedicatedThread() 
    { 
    var thread = new Thread(
    () => 
     { 
     while (true) 
     { 
      Action action = actions.Take(); 
      action(); 
     } 
     }); 
    } 

    public void SubmitAction(Action action) 
    { 
    actions.Add(action); 
    } 
} 

और आप इसे इस तरह उपयोग कर सकते हैं।

if (loggingOutsideTransaction) 
{ 
    // Execute asynchronously on a dedicated thread. 
    dedicatedThread.SubmitAction(yourActionDelegate); 
} 
else 
{ 
    // Execute synchronously. 
    yourActionDelegate(); 
} 
+0

यह बहुत अच्छा लग रहा है, लेकिन मेरे कई तरीकों में कई पैरामीटर हैं। अधिकांश 'स्ट्रिंग' और 'int' हैं लेकिन मुझे उन्हें पास करने की आवश्यकता है। क्या इस सेटअप के साथ ऐसा करने का कोई तरीका है? (ऐसा लगता है कि यह विधि को कॉल करता है, लेकिन प्रत्येक कॉल के साथ पैरामीटर की अनुमति नहीं देता है।) – Vaccano

+2

@Vaccano: आप इसके बजाय 'एक्शन ' का उपयोग कर सकते हैं। या जब लैम्ब्डा अभिव्यक्ति के माध्यम से 'एक्शन' प्रतिनिधि का निर्माण करते हैं तो आप चर पर बंद कर सकते हैं। –

संबंधित मुद्दे