কিভাবে বুঝতে যদিও yieldশব্দ কাজ, আমি জুড়ে এসেছিল link1 এবং link2 Stackoverflow যা ব্যবহার অত্যাবশ্যক yield returnযখন DataReader উপর iterating এবং ভাল হিসাবে এটি আমার প্রয়োজন suits। তবে এটি আমাকে কী ঘটছে তা ভাবতে বাধ্য করে, যদি আমি 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() কার্যকর হয় না। কীভাবে আমি তখন ডিবি সংযোগ বন্ধের বিষয়টি নিশ্চিত করতে পারি? yieldকীওয়ার্ড ব্যবহারের চেয়ে ভাল উপায় আছে কি ? আমি একটি কাস্টম ক্লাস ডিজাইনের চেষ্টা করছি যা ডিবিতে নির্বাচিত এসকিউএল এবং সঞ্চিত পদ্ধতিগুলি কার্যকর করার জন্য দায়বদ্ধ এবং ফলাফলটি ফিরে আসবে। তবে আমি কলকারীকে ডেটা রিডার ফিরিয়ে দিতে চাই না। এছাড়াও আমি নিশ্চিত করতে চাই যে সংযোগটি সমস্ত পরিস্থিতিতে বন্ধ হয়ে যাবে।
সম্পাদন করা বেনের উত্তরের উত্তর পরিবর্তন করেছে কারণ পদ্ধতি আহ্বানকারীদের পদ্ধতিটি সঠিকভাবে ব্যবহার করা আশা করা ভুল এবং ডিবি সংযোগের ক্ষেত্রে পদ্ধতিটি অকারণে একাধিকবার বলা হলেও এটি আরও ব্যয়বহুল হবে।
বিস্তারিত ব্যাখ্যার জন্য জাকব এবং বেনকে ধন্যবাদ।