2011-06-13 14 views
5

मैं अनुप्रयोगों है कि मैं पर काम कर रहा हूँ में से एक में डीबी से कनेक्ट करने के कोड की समीक्षा कर रहा था और मैं जबकि पाश चिंता इससबसे अच्छा तरीका है जब तक चीजें सी # में जुड़े हुए हैं

if (_dbConnection == null) 
    _dbConnection = GetConnection(); 

while (_dbConnection.State == ConnectionState.Connecting) 
{ 
    //Do Nothing until things are connected. 
} 

if (_dbConnection.State != ConnectionState.Open) 
    _dbConnection.Open(); 

var command = GetCommand(commandType); 
command.Connection = _dbConnection; 
return command; 

देखा मुझे। चीजें जुड़े होने तक कुछ भी करने का कोई बेहतर तरीका नहीं है?

संपादित करें:

कनेक्शन के रूप में मिल गया है ध्यान में रखते हुए इस है एक वेब अनुप्रयोग, तो सबसे अच्छा होगा समय की अवधि तब से बीत चुका कनेक्ट करने का प्रयास शुरू कर दिया गणना करने के लिए है

private static IDbConnection GetConnection() 
{ 
    return new SqlConnection(ConfigurationManager.ConnectionStrings["CoonectionStringName"].ConnectionString); 
} 
+2

किस प्रकार का कनेक्शन? System.Data.SqlClient.SqlConnection? –

+1

मैं समय-समय पर लूप को देरी/प्रतीक्षा कथन में डाल दूंगा ताकि आप CPU समय बर्बाद नहीं कर रहे हैं – Earlz

+0

कनेक्शन की श्रेणी System.Data.IDbConnection – Omar

उत्तर

5

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

इससे बचने के लिए, प्रोसेसर को CPU समय की प्रतीक्षा करने वाले सभी अन्य थ्रेडों के माध्यम से स्पिन करने के लिए थ्रेड.इल्ड() कथन का उपयोग करें और जब वे पूरा हो जाएं तो वापस आएं। यह मूल रूप से रिक्त लूप के माध्यम से सीपीयू को घुमाने के बजाय, पृष्ठभूमि प्रक्रिया पर प्रतीक्षा करते समय कंप्यूटर को कुछ काम करने की अनुमति देता है। यह असली सरल है; यहां जस्टिन का उत्तर संशोधित है:

var startTime = DateTime.Now; 
var endTime = DateTime.Now.AddSeconds(5); 
var timeOut = false; 

while (_dbConnection.State == ConnectionState.Connecting) 
{ 
    if (DateTime.Now.CompareTo(endTime) >= 0) 
    { 
     timeOut = true; 
     break; 
    } 
    Thread.Yield(); //tells the kernel to give other threads some time 
} 

if (timeOut) 
{ 
    Console.WriteLine("Connection Timeout"); 
    // TODO: Handle your time out here. 
} 
1

अनुसरण करता है और अगर यह एक टाइमआउट अवधि से अधिक है तो बचें। जाहिर है, उस बिंदु पर एक अपवाद फेंक दें या स्थिति को संभालें।

var startTime = DateTime.Now; 
var endTime = DateTime.Now.AddSeconds(5); 
var timeOut = false; 

while (_dbConnection.State == ConnectionState.Connecting) 
{ 
    if (DateTime.Now.Compare(endTime) >= 0 
    { 
     timeOut = true; 
     break; 
    } 
} 

if (timeOut) 
{ 
    // TODO: Handle your time out here. 
} 
+0

इस परिदृश्य में, जबकि लूप अभी भी चल रहा है और प्रोसेसर समय का एक बड़ा हिस्सा प्राप्त कर रहा है। – Omar

2

संपादित: कृपया ध्यान दें कि इस DbConnection के लिए काम करता है और नहीं IDbConnection

तुम हमेशा DbConnection वर्ग के बजाय जबकि पाश की StateChange घटना का उपयोग कर सकते हैं।

चेक this

+0

बस सोच रहा है। अगर कनेक्शन कभी नहीं आता है तो क्या होगा? क्या घटना कभी आग नहीं होगी? – Omar

+0

@tou: इसे कनेक्शन टाइमआउट अपवाद द्वारा अलग से संभाला जाना चाहिए ... – Chandu

+0

क्या यह पूरी तरह से काम करेगा? क्या होगा यदि एक ही कनेक्शन वापस कर दिया गया था? आप हैंडलर जमा करेंगे। – Kit

0

स्टेट चेंज ईवेंट पर एक हैंडलर हुक करें। जब राज्य खुला है, तो क्या आवश्यक है।

  m_SqlConnection = new SqlConnection(ConnectionStringBuilder.ConnectionString); 
      m_SqlConnection.StateChange += new System.Data.StateChangeEventHandler(m_SqlConnection_StateChange); 
      m_SqlConnection.Open(); 



    void m_SqlConnection_StateChange(object sender, System.Data.StateChangeEventArgs e) 
    { 
     try 
     { 
      if (m_SqlConnection.State == ConnectionState.Open) 
      { 
       //do stuff 
      } 
      if (m_SqlConnection.State == ConnectionState.Broken) 
      { 
       Close(); 
      } 
      if (m_SqlConnection.State == ConnectionState.Closed) 
      { 
       Open(); 
      } 
     } 
     catch 
     { 

     } 
    } 
+0

का पर्दाफाश नहीं करता है, मैं ऐसा करने की कोई अनुशंसा नहीं करता, क्योंकि प्रत्येक राज्य परिवर्तन अलग-अलग थ्रेड पर चल रहा है, और यह विभिन्न धागे से कनेक्शन का उपयोग करते समय असंगतता का कारण बन सकता है, – Idan