繁体   English   中英

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

[英]When should I call SerialPort.Dispose() vs SerialPort.Close()?

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

我的问题与使用SerialPort.Dispose()SerialPort.Close() 我在几个地方使用Close() ,我从文档中了解到它调用了SerialPort上的Dispose()方法。 但是,如果在我的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;
    }
}

调用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 );
    }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM