当前位置: 首页 > 编程语言 > C#

YieldReturnsinUseSharing

时间:2023-04-10 21:59:37 C#

YieldReturnsinUse没记错的话,在usingSqlConnection块中使用yield时,出现运行时异常。使用(varconnection=newSqlConnection(connectionString)){varcommand=newSqlCommand(queryString,connection);connection.Open();SqlDataReaderreader=command.ExecuteReader();//在访问数据之前调用Read。while(reader.Read()){yieldreader[0];}//完成后调用Closereader.reader.Close();当我用List替换yield时,我解决了这些问题,我在每个迭代项目中添加。在内部使用StreamReader块时,我没有遇到同样的问题using(varstreamReader=newStreamReader(fileName)){stringline;while((line=streamReader.ReadLine())!=null){yieldreturnline;是否有解释为什么异常发生在前一种情况而不是后者?这座建筑令人向往吗?编辑为了弄清楚我过去做错了什么(早期处理),你应该调用下面的第一个方法:}//由于延迟执行,Dispose将在ReadLine()之前执行}IEnumerableRead(StreamReaderstreamReader){stringline;while((line=streamReader.ReadLine())!=null){yieldreturnline;}}使用其他延迟执行同样的错误可以用System.Linq.Enumerable.Select()等方法来实现关于using和yield问题的详细解释请看这篇文章。因为您在枚举器中返回,所以using块在访问任何内容之前已经破坏了上下文。答案有很好的解决方案,基本上,要么使用包装器方法作为枚举器,要么构建一个列表。此外,通常更实际的做法是使用而不是围绕阅读器连接,并使用CommandBehavior.CloseConnection来确保在阅读器完成后释放资源。虽然在您的情况下并不重要,但如果您从方法返回数据读取器,这将确保连接在处理程序处理它时正确关闭。using(SqlDataReaderreader=command.ExecuteReader(CommandBehavior.CloseConnection)){while(reader.Read()){yieldreader[0];在这两种情况下,编译器都应该正确处理using块中的yield。没有明显的理由应该抛出异常。需要注意的一件事是,在您完成迭代和/或手动处理枚举器对象之前,不会处理连接。如果你在公共方法中公开这段代码,愚蠢或恶意代码可能会使你的连接长时间保持打开状态:需要了解更多有关C#学习教程的信息,希望大家多多关注——varenumerable=YourMethodThatYieldsFromTheDataReader();varenumerator=enumerable.GetEnumerator();枚举器.MoveNext();线程。睡眠(永远);//你的连接永远不会被释放本文来自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: