निष्पादन थ्रेड्स का कॉन्टेक्स्ट - सी #, मल्टीथ्रेडिंग, थ्रेड कॉन्टेक्स्ट

इसका उद्देश्य क्या है 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 № 1

ExecutionContext का विवरण बहुत अस्पष्ट है, डीईटी रिमोटिंग और डब्ल्यूसीएफ जैसी सुविधाओं के अंदर गहरी दफन है। इसका हिस्सा क्या है:

  • HttpExecutionContext
  • IllogicalCallContext, Remoting द्वारा उपयोग किए गए थ्रेड विशिष्ट डेटा का एक संग्रह
  • ऊपर के रूप में LogicalContext
  • SecurityContext
  • SynchronizationContext

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

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

संपादन 2: .NET 4.6 में अधिक अच्छी तरह से तय किया गया है, संस्कृति अब अपेक्षा के अनुसार बहती है।


जवाब के लिए 6 № 2

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

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

ExecutionContext ।RestoreFlow थ्रेड्स के बीच निष्पादन प्रसंग के बीतने को पुनर्स्थापित करता है ।

आखिर

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

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


उत्तर № 3 के लिए 1

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

ExecutionContext.SuppressFlow:

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

ExecutionContext.RestoreFlow:

पुनर्स्थापित करें एक पूर्व SuppressFlow विधि कॉल के प्रभाव को उलट देता है।

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

जोर मेरा


उत्तर के लिए 1 № 4

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

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


जवाब के लिए 0 № 5

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


संबंधित सवाल
सबसे लोकप्रिय