2009-12-23 9 views
7

ExecutionContext.SuppressFlow(); का उद्देश्य क्या है? निम्नलिखित कोड में वास्तव में क्या दबाया जाता है?निष्पादन थ्रेड के कॉन्टेक्स्ट

मैं इस परीक्षण कोड है ...

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    Thread[] th = new Thread[100]; 
    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB"); 

    AsyncFlowControl cntrl = ExecutionContext.SuppressFlow(); 
    for (int i = 0; i < th.Length; i++) 
    {     
     th[i] = new Thread(new ParameterizedThreadStart(ThreadMethod)); 
     th[i].Name = "Thread #" + (i+1).ToString();     
     th[i].Start((i+1).ToString()); 
    } 
    ExecutionContext.RestoreFlow(); 

    foreach (Thread t in th)    
    { 
     t.Join(); 
    } 
    Response.Write(response); 
} 


String response = null; 
Random rnd = new Random(1000); 
private void ThreadMethod(object param) 
{ 
    if (param != null) 
    { 
     string temp = param as string; 
     if (temp != null) 
     { 
     //To test what is the current culture I get for this thread execution 
     System.Globalization.CultureInfo info = Thread.CurrentThread.CurrentCulture; 
     for (int i = 0; i <= 10; i++) 
     { 
      Thread.Sleep(rnd.Next(2000)); 
      response += Thread.CurrentThread.ManagedThreadId.ToString() + ":" 
        + Thread.CurrentThread.Name + ": " + temp + "<br/>"; 
     } 
     } 
    } 
} 

उत्तर

8

निष्पादन कॉन्टेक्स्ट का विवरण बहुत अस्पष्ट है, .NET Remoting और WCF जैसी सुविधाओं के अंदर गहरी दफन है। क्या इसका हिस्सा है:

  • IllogicalCallContext, दूरस्थ रूप
  • LogicalContext द्वारा इस्तेमाल किया धागा विशिष्ट डेटा का भंडार

    • HostExecutionContext, ऊपर
    • SecurityContext रूप
    • SynchronizationContext

    CultureInfo इसका हिस्सा नहीं है, यदि आप अपना एम बदलते हैं तो यह एक बड़ी समस्या हो सकती है ऐन थ्रेड की डिफ़ॉल्ट संस्कृति। उस संस्कृति के साथ अन्य थ्रेड चलाने के लिए कोई अच्छा तरीका नहीं है जबतक कि आप उन्हें स्विच करने के लिए स्पष्ट रूप से कोड नहीं लिखते। यह हमेशा व्यावहारिक नहीं है, यह देखते हुए कि .NET थ्रेडपूल थ्रेड पर एसिंक कॉलबैक चलाने के लिए उपयुक्त है। उन्हें सिस्टम डिफ़ॉल्ट संस्कृति में शुरू किया जाएगा।

    संपादित करें: इस समस्या CultureInfo.DefaultThreadCurrentCulture संपत्ति के साथ .NET 4.5 में तय हो गया।

    EDIT2: नेट 4.6 में और अधिक अच्छी तरह से तय हो गई, संस्कृति अब अपेक्षा के अनुरूप बहती है।

  • +0

    यह ऐप डेवलपमेंट फाउंडेशन पुस्तक में लिखा गया है कि, "डिफ़ॉल्ट रूप से, निष्पादन संदर्भ सहायक धागे पर बहता है, लेकिन यह लागत पर ऐसा करता है। यदि आप संदर्भ जानकारी के प्रवाह को रोकना चाहते हैं (प्रदर्शन में वृद्धि लेकिन वर्तमान सुरक्षा, संस्कृति, और लेनदेन संदर्भ जानकारी खोना), आप ExecutionContext वर्ग का उपयोग कर सकते हैं। ", ** @ nobugz: ** क्या आप कृपया इसे समझा सकते हैं ?? –

    +0

    * संस्कृति * वर्तमान धागा भाषा, मुद्रा या नंबर प्रतिनिधित्व, आदि के रूप में इस तरह की जानकारी का मतलब है – serhio

    +0

    ** @ Serhio: ** हाँ और इस CultureInfo में शामिल किया जाता है तो इसका मतलब यह है कि अगर हम को दबाने और संस्कृति को बदलने यह नहीं मिलेगा इस दायरे में बनाए गए धागे को अग्रेषित किया गया ?? और अगर हम दबाने नहीं देते हैं तो यह सहायक धागे से गुज़र जाएगा ?? उपर्युक्त कोड में, हालांकि, चाहे मैं दबाने या नहीं, थ्रेड संस्कृति अलवासी एन-यूएस है, जो मशीन डिफ़ॉल्ट है। –

    6

    ExcecutionContext। SuppressFlow एसिंक्रोनस थ्रेड में निष्पादन संदर्भ के प्रवाह को दबा देता है।

    ExecutionContext, परोक्ष बच्चे को एक करने के लिए माता पिता के धागे से पारित कर दिया, निष्पादन के एक तार्किक धागा के लिए प्रासंगिक जानकारी प्रदान करता है कर रहे हैं: सुरक्षा के संदर्भ में, कॉल संदर्भ और तुल्यकालन संदर्भ। यदि वह जानकारी अनिवार्य नहीं है, तो निष्पादन संदर्भ को छोड़कर मल्टीथ्रेडिंग एप्लिकेशन के प्रदर्शन को थोड़ा सा अनुकूलित करें।

    निष्पादन कॉन्टेक्स्ट। पुनर्स्थापित करें धागे के बीच निष्पादन संदर्भ के पारित होने को पुनर्स्थापित करता है।

    अंत में

    क्यू: निम्न कोड में वास्तव में दबा दिया जाता है क्या ??

    : बिल्कुल निम्नलिखित जानकारी के पारित होने पर दबाने वाले हैं: सुरक्षा संदर्भ, कॉल संदर्भ और सिंक्रनाइज़ेशन संदर्भ; नव निर्मित धागे के बीच। क्यों ऐसा किया गया था? वें लम्बाई निर्मित सृजन के निर्माण और कार्य को अनुकूलित करने के लिए: धागे के बीच पारित कम पूरक जानकारी - तेज़ यह थ्रेड उनके बीच बातचीत करता है।

    +0

    खैर मेरी क्यू के बिल्कुल नहीं था यह ... यह तकनीकी शब्दावली का एक प्रकार हम एक लेख में पढ़ने के लिए मिल गया है। मैंने ऊपर कुछ कोड प्रस्तुत किया है और इसके संबंध में मैं प्रबुद्ध होना चाहता था कि उपर्युक्त कोड में वास्तव में क्या दबाया गया था .. –

    +0

    @ एस एम कर्मन: मेरा संपादन देखें। – serhio

    1

    आपके प्रश्न का उत्तर नहीं है, लेकिन चूंकि आप इस कोड को देख रहे हैं और अभी इसे समझने की कोशिश कर रहे हैं, तो कृपया जांचें कि क्या आप दस्तावेज के अनुसार अपना कोड अनुकूलित/बदलना चाहते हैं (यानी "इसे ठीक करें") :

    ExecutionContext.SuppressFlow:

    आप ExecutionContext के प्रवाह को बहाल करने के लिए लौट आए AsyncFlowControl संरचना पर पूर्ववत विधि का उपयोग करना होगा।

    ExecutionContext.RestoreFlow:

    RestoreFlow एक पूर्व SuppressFlow विधि कॉल के प्रभाव को उलट देता है।

    इस विधि को SuppressFlow विधि द्वारा वापस AsyncFlowControl संरचना की पूर्ववत विधि द्वारा बुलाया जाता है। आपको निष्पादन संदर्भ के प्रवाह को पुनर्स्थापित करने के लिए पूर्ववत विधि का उपयोग करना चाहिए, RestoreFlow विधि नहीं।

    जोर मेरा।

    +0

    ** @ बेंजामिन Podszun: ** ExecutionContext.RestoreFlow; भी मान्य है। हालांकि अंडो को प्राथमिकता दी गई है .. –

    1

    मैंने इसे पढ़ा - "जब कोई धागा बनाया जाता है, तो रनटाइम सुनिश्चित करता है कि प्रारंभिक थ्रेड का निष्पादन संदर्भ नए धागे पर बहता है। इस तरह नए धागे के माता-पिता के समान विशेषाधिकार होते हैं। डेटा की प्रतिलिपि हालांकि, कुछ संसाधनों का खर्च होता है। अगर आपको इस डेटा की आवश्यकता नहीं है, तो आप ExecutionContext.SuppressFlow विधि का उपयोग करके इस व्यवहार को अक्षम कर सकते हैं। "

    स्रोत: सी # परीक्षा 70-483 में प्रोग्रामिंग। लेखक: Wouter डी Kort

    +0

    आप एप्लिकेशन के निष्पादन समय को कम करके प्रदर्शन सुधारने के लिए ExecutionContext.SuppressFlow() को कॉल करेंगे क्योंकि विधि कॉल अभिभावक धागे से संदर्भ डेटा की प्रतिलिपि को बच्चे धागे में कॉपी करने से रोकेगी जो अन्यथा प्रभावित होने पर निष्पादन समय को प्रभावित या बढ़ाएगी बाल धागे में पैरेंट थ्रेड का संदर्भ डेटा। –

    0

    जब एक धागा बनाया जाता है, क्रम सुनिश्चित करता है कि शुरुआत धागा को फांसी संदर्भ नया थ्रेड को प्रवाहित होती है। इस तरह नए धागे के माता-पिता के समान विशेषाधिकार होते हैं। डेटा की प्रतिलिपि बनाने के लिए कुछ संसाधनों का खर्च होता है। यदि आपको इस डेटा की आवश्यकता नहीं है, तो आप ExecutionContext.SuppressFlow विधि का उपयोग करके इस व्यवहार को अक्षम कर सकते हैं।

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