相关疑难解决方法(0)

Stream.Dispose总是调用Stream.Close(和Stream.Flush)

如果我有以下情况:

StreamWriter MySW = null;
try
{
   Stream MyStream = new FileStream("asdf.txt");
   MySW = new StreamWriter(MyStream);
   MySW.Write("blah");
}
finally
{
   if (MySW != null)
   {
      MySW.Flush();
      MySW.Close();
      MySW.Dispose();
   }
}
Run Code Online (Sandbox Code Playgroud)

MySW.Dispose()即使提供了,我可以打电话并跳过关闭吗?是否存在任何不能按预期工作的Stream implament(如CryptoStream)?

如果没有,那么以下只是错误的代码:

using (StreamWriter MySW = new StreamWriter(MyStream))
{
   MySW.Write("Blah");
}
Run Code Online (Sandbox Code Playgroud)

.net c# using

62
推荐指数
3
解决办法
4万
查看次数

SqlCommand.Dispose是否关闭连接?

我可以有效地使用这种方法吗?

using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString))
{
    cmd.Connection.Open();
    // set up parameters and CommandType to StoredProcedure etc. etc.
    cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

我担心的是:SqlCommand的Dispose方法(在退出using块时调用)是否会关闭底层的SqlConnection对象?

.net garbage-collection dispose sqlcommand sqlconnection

51
推荐指数
2
解决办法
4万
查看次数

关闭或处置

StreamReader类同时具有close和dispose方法.我想知道要调用哪种方法来清理所有资源.

如果使用使用块,我认为它会调用它的dispose方法.是否足以清理所有资源.

.net c#

33
推荐指数
2
解决办法
2万
查看次数

关闭和处置WCF服务

Close上一个方法ICommunicationObject可以抛出两种类型的异常如MSDN概述这里.我理解为什么该Close方法可以抛出这些异常,但我不明白为什么Dispose服务代理上的Close方法在没有try它的情况下调用该方法.你的Dispose方法不是你想要的地方,确保你没有抛出任何例外吗?

wcf web-services

14
推荐指数
2
解决办法
9664
查看次数

connection.Close()和connection.Dispose()有什么区别?

我注意到该SQLiteConnection对象System.Data.SQLite拥有两个类似的方法:

  • Close()
  • Dispose()

SQLiteDataReader对象相同.

有什么不同 ?

.net c# system.data.sqlite

10
推荐指数
2
解决办法
3万
查看次数

Dapper 如何在不显式打开连接的情况下执行查询?

我们使用 Dapper 进行某些数据访问活动,并使用标准推荐方法连接到数据库,如下所示:

public static Func<DbConnection> ConnectionFactory = () => new SqlConnection(ConnectionString);
Run Code Online (Sandbox Code Playgroud)

但是,如果我们尝试执行一条语句,在文档中它表明您需要首先声明:

using (var conn = ConnectionFactory())
{
   conn.Open();
   var result =  await conn.ExecuteAsync(sql, p, commandType: CommandType.StoredProcedure);
   return result;
}
Run Code Online (Sandbox Code Playgroud)

这意味着,您必须显式打开连接。但是,如果我们省略该声明conn.open(),它也可以工作,我们担心在这种情况下连接可能无法正确处理。

如果有任何关于如何在显式打开任何连接的情况下执行 SQL 的评论,我将不胜感激。

dapper

9
推荐指数
1
解决办法
8355
查看次数

在具有Finalizer的类上调用.Dispose()

根据Essential C#6.0,你应该:

AVOID在拥有终结器的拥有对象上调用Dispose().相反,依靠终结队列来清理实例.

  1. 有人可以详细说明这一点,因为我不清楚Dispose的重点是什么,如果我们不从拥有的对象中调用它?
  2. 除了Reflection之外,你怎么知道对象是否有Finalizer
  3. 除了搜索API文档(如果您可以访问它并且存在)或者反射之外,您如何知道何时调用Close()/ Close()+ Dispose()?对于非常具体的类型(MemoryStream/ Form/ SqlConnection/ etc),我在网络上看到了很多问题,但我更关注"如何自己解决".

根据Dispose Pattern你应该:

除了Dispose()之外,CONSIDER提供方法Close(),如果close是该区域中的标准术语.这样做时,将Close实现与Dispose相同并考虑显式实现IDisposable.Dispose方法非常重要.

但有时候你应该像两个人一样打电话Form等.像" 关闭和处理 - 要打电话的人? "这样的问题越来越接近,但除此之外没有明确的方法

像往常一样答案是:这取决于.不同的类以不同的方式实现IDisposable,由您来做必要的研究.

编辑:这是完整的指南,我没有要求复制许可,但因为它是一个指南(因此假设它应该是自由共享的公共知识)而不是实际培训材料的某些部分,我希望我'我没有违反任何规则.

准则
DO仅对具有稀缺或昂贵资源的对象实施终结器方法,即使最终化延迟了垃圾收集.
实现IDisposable以支持具有终结器的类的确定性终结.
如果没有显式调用Dispose(),请对实现IDisposable的类实现终结器方法.
DO重构一个finalization方法来调用与IDisposable相同的代码,也许只是调用Dispose()方法.
不要从终结器方法中抛出异常.
从Dispose()调用System.GC.SuppressFinalize()以避免重复资源清理并延迟对象上的垃圾回收.
确保Dispose()是幂等的(应该可以多次调用Dispose()).
保持Dispose()简单,专注于最终化所需的资源清理.
AVOID在拥有终结器的拥有对象上调用Dispose().相反,依靠终结队列来清理实例.
避免引用在最终确定期间未完成的其他对象.
在重写Dispose()时,请调用基类的Dispose()方法.
在调用Dispose()之后,考虑确保对象变得不可用.在处理了一个对象之后,Dispose()以外的方法(可能被多次调用)应抛出一个ObjectDisposedException.
在具有一次性字段(或属性)的类型上实现IDisposable并处理所述实例.

c# dispose finalizer

5
推荐指数
1
解决办法
420
查看次数

我应该什么时候调用 SerialPort.Dispose() 与 SerialPort.Close()?

我有一个SerialPort用于连接到虚拟 COM 端口的端口。由于连接是持久的,我必须保留对 的引用SerialPort,以便打开、关闭和以其他方式管理端口。我也在IDisposable我的班级上实现(不是完整的 Dispose 模式,因为我实际上没有任何适当的非托管资源,只有SerialPort)。

我的问题与SerialPort.Dispose()vs的使用有关SerialPort.Close()。我用Close()在几个地方,我从这个调用的文件理解Dispose()的方法SerialPort。但是,如果像我的TryConnect()方法一样, 可能SerialPort从未打开过怎么办?我应该简单地调用Dispose(),然后就这样吗?或者该Close()方法是更好的选择?

更广泛地说,使用其中一种方法而不是另一种方法总是一个好主意吗?

我的代码中的一些相关片段如下。

public bool TryConnect() {
    CheckDisposed();
    try {
        connectedPort = new SerialPort(SelectedPort);
        connectedPort.WriteTimeout = 1000;
        connectedPort.DataReceived += P_DataReceived;
        connectedPort.Open();
        return true;
    } catch (Exception e) {
        if (connectedPort != null) {
            connectedPort.Dispose();
            connectedPort = null;
        }

        return false;
    }
}

public void Disconnect() {
    CheckDisposed(); …
Run Code Online (Sandbox Code Playgroud)

c# dispose

5
推荐指数
1
解决办法
6334
查看次数

DbConnection在超出范围时是否关闭并处理?

可能重复:
关闭和处理 - 要调用哪个?

我的数据层中的许多函数不受try-catchusing子句的保护.

我的GUI层有try-catch子句.这还够吗?

dbConnection如果引发异常,我可以依赖处理和关闭的其他对象吗?GUI层将处理异常.

.net c# ado.net garbage-collection dispose

2
推荐指数
1
解决办法
759
查看次数

如何以最佳方式在 C# 中处理 SQL 连接?

我已经SqlConnection这样处理了:

sqlcon.open();
sqlcom.ExecuteNonQuery();
sqlcom.close();
Run Code Online (Sandbox Code Playgroud)

但我对这种处理方式并不满意。

.net c# asp.net ado.net webforms

1
推荐指数
1
解决办法
6044
查看次数