2009-12-08 8 views
6

क्या मैं अपने एएसपी.NET Pages और UserControls कक्षाओं में static विधियों का उपयोग कर सकता हूं यदि वे किसी भी इंस्टेंस सदस्यों का उपयोग नहीं करते हैं? आईई .:एएसपी.NET कोड-कक्षाओं के पीछे गैर-थ्रेड-सुरक्षित में स्थिर तरीके हैं?

protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    gridStatement.DataSource = CreateDataSource(); 
    gridStatement.PageIndex = e.NewPageIndex; 
    gridStatement.DataBind(); 
} 

private static DataTable CreateDataSource() 
{ 
    using (var command = new SqlCommand("SELECT foobar")) 
    { 
     var table = new DataTable(); 
     new SqlDataAdapter(command).Fill(table); 
     return table; 
    } 
} 

या यह थ्रेड-सुरक्षित नहीं है?

+0

चर किस प्रकार है " आदेश "ऑब्जेक्ट? – Kane

उत्तर

8

हां, आप स्थिर सदस्यों का उपयोग कर सकते हैं - वे थ्रेड-सुरक्षित हैं। प्रत्येक धागा एक अलग संदर्भ में निष्पादित होगा और इसलिए एक स्थिर विधि के अंदर बनाई गई कोई भी वस्तु केवल उस धागे से संबंधित होगी।

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

+0

मुझे लगता है कि आपकी टिप्पणी "आप स्थिर सदस्यों का उपयोग कर सकते हैं" गलत है। एक "सदस्य" एक क्षेत्र, संपत्ति, या विधि है। तो उस परिभाषा के अनुसार एक स्थिर सदस्य (चर) और एक स्थिर क्षेत्र एक ही बात है। हो सकता है कि आप कहें कि स्थिर तरीकों का उपयोग करना ठीक है। स्थैतिक विधि में बनाए गए किसी ऑब्जेक्ट के बारे में बयान केवल उस धागे से संबंधित होगा जो भ्रामक है। कोई भी आवृत्ति परिवर्तनीय (गैर स्थैतिक) थ्रेडसेफ है भले ही विधि स्थिर है या नहीं। एक स्थिर विधि का मतलब है कि कोड स्थैतिक है; यह चर के बारे में कुछ भी नहीं कहता है। – Matt

2

धागे भर में साझा नहीं किया गया है, इसलिए यह धागा सुरक्षित है। जब तक आप स्थिर सदस्यों तक पहुंच नहीं पाते हैं कि अन्य स्थैतिक तरीकों के साथ एक साथ निष्पादित करने का मौका है ...

1

यह है। धागे-सुरक्षितता के बारे में आपके संदर्भ में चिंता करने की एकमात्र चीज एक अवधारणा है जिसमें स्थिर सदस्य शामिल हैं, जैसा कि पहले से ही कहा गया है। जब कोई विधि (स्थैतिक या नहीं) स्थिर सदस्य तक पहुंच जाती है, तो आपको मल्टीथ्रेडिंग समस्याओं के बारे में चिंता करनी चाहिए। पर विचार निम्नलिखित:

public class RaceConditionSample 
{ 
    private static int number = 0; 
    public static int Addition() 
    { 
     int x = RaceConditionSample.number; 
     x = x + 1; 
     RaceConditionSample.number = x; 
     return RaceConditionSample.number; 
    } 

    public int Set() 
    { 
     RaceConditionSample.number = 42; 
     return RaceConditionSample.number; 
    } 

    public int Reset() 
    { 
     RaceConditionSample.number = 0; 
     return RaceConditionSample.number; 
    } 
} 

RaceConditionSample sample = new RaceConditionSample(); 
System.Diagostics.Debug.WriteLine(sample.Set()); 

// Consider the following two lines are called in different threads in any order, Waht will be the 
// output in either order and/or with any "interweaving" of the individual instructions...? 
System.Diagostics.Debug.WriteLine(RaceConditionSample.Addition()); 
System.Diagostics.Debug.WriteLine(sample.Reset()); 

जवाब है: यह हो सकता है "42, 43, 0", "42, 0, 1" आप अभ्यस्त करने से पहले पता ..