यह समझने के लिए कि yield
कीवर्ड कैसे काम करता है, मैं StackOverflow पर link1 और link2 के पार आया, जो yield return
DataReader पर पुनरावृत्ति करते हुए इसके उपयोग की वकालत करता है और यह मेरी आवश्यकता के अनुरूप भी है। लेकिन यह मुझे आश्चर्यचकित करता है कि क्या होता है, अगर मैं yield return
नीचे दिखाए गए अनुसार उपयोग करता हूं और अगर मैं पूरे डेटारीडर के माध्यम से पुनरावृति नहीं करता हूं, तो क्या डीबी कनेक्शन हमेशा के लिए खुला रहेगा?
IEnumerable<IDataRecord> GetRecords()
{
SqlConnection myConnection = new SqlConnection(@"...");
SqlCommand myCommand = new SqlCommand(@"...", myConnection);
myCommand.CommandType = System.Data.CommandType.Text;
myConnection.Open();
myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
try
{
while (myReader.Read())
{
yield return myReader;
}
}
finally
{
myReader.Close();
}
}
void AnotherMethod()
{
foreach(var rec in GetRecords())
{
i++;
System.Console.WriteLine(rec.GetString(1));
if (i == 5)
break;
}
}
मैंने एक नमूना कंसोल ऐप में एक ही उदाहरण की कोशिश की और डिबगिंग करते समय देखा कि आखिरकार ब्लॉक GetRecords()
निष्पादित नहीं किया गया है। मैं यह सुनिश्चित कैसे कर सकता हूं कि DB कनेक्शन बंद हो गया है? क्या yield
कीवर्ड का उपयोग करने से बेहतर तरीका है ? मैं एक कस्टम क्लास डिजाइन करने की कोशिश कर रहा हूं जो चुनिंदा एसक्यूएल और डीबी पर संग्रहीत प्रक्रियाओं को निष्पादित करने के लिए जिम्मेदार होगा और परिणाम लौटाएगा। लेकिन मैं Caller को DataReader वापस नहीं करना चाहता। इसके अलावा, मैं यह सुनिश्चित करना चाहता हूं कि कनेक्शन सभी परिदृश्यों में बंद हो जाएगा।
संपादित करें बेन के उत्तर के उत्तर को बदल दें क्योंकि विधि कॉलर्स से विधि का सही तरीके से उपयोग करने की अपेक्षा करना गलत है और डीबी कनेक्शन के संबंध में यह अधिक महंगा होगा यदि विधि को बिना किसी कारण के कई बार कहा जाता है।
विस्तृत विवरण के लिए धन्यवाद जैकब और बेन।