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

时间:2018-01-23 04:31:05

标签: c# dispose

我有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();
    if (connectedPort != null) {
        connectedPort.Close();
        connectedPort = null;
    }
}

public void Dispose() {
    if (!disposed) {
        if (connectedPort != null) {
            connectedPort.Close();
            connectedPort = null;
        }

        disposed = true;
    }
}

2 个答案:

答案 0 :(得分:2)

致电Close等于致电Dispose(true)

https://github.com/Microsoft/referencesource/blob/master/System/sys/system/IO/ports/SerialPort.cs

    // Calls internal Serial Stream's Close() method on the internal Serial Stream.
    public void Close()
    {
        Dispose();
    }


    protected override void Dispose( bool disposing )
    {
        if( disposing ) {
            if (IsOpen) {
                internalSerialStream.Flush();
                internalSerialStream.Close();
                internalSerialStream = null;
            }
        }
        base.Dispose( disposing );
    }

答案 1 :(得分:2)

Close与此类的Dispose相同。使用ILSpy,这是Close方法的代码:

public void Close()
{
    base.Dispose();
}