处置 Class

Dispose the Class

在我的项目中有一个名为 DataParse 的 class。我正在与以太网建立多个连接。每次打开新连接时,我都会创建一个新的 class,如下所示。此外,此 class.

中有一个计时器
public Dictionary<string, DataParse> classDictionary = new Dictionary<string, DataParse>();

连接代码

string IpAddress = Ip.Text;
int Port = Convert.ToInt32(PortName.Text);
var IpPort = IpAddress + ":" + Port;
classDictionary.Add(IpPort, new DataParse());
classDictionary[IpPort].DataParseRun(IpPort);

我想在连接关闭时销毁创建的 class。我想用 class.

破坏计时器

我实现了类似这样的方法来销毁 class 但我失败了。他又开始计时了。

断开连接的代码

private void Events_Disconnected(object sender, ClientDisconnectedEventArgs e)
{
    classDictionary[e.IpPort].Dispose();
    classDictionary.Remove(e.IpPort);
}

数据解析代码

public class  DataParse : IDisposable
    {

    private bool _disposed = false;
    private SafeHandle _safeHandle = new SafeFileHandle(IntPtr.Zero, true);
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed)
        {
            return;
        }

        if (disposing)
        {
            // Dispose managed state (managed objects).
            _safeHandle?.Dispose();
        }

        _disposed = true;
    }
    
    Timer timer;
    byte[] moduleBuffer;
    int writePtr;
    string key;



    public void DataParseRun(string IpPort)
    {
        moduleBuffer = new byte[50000];
        writePtr = 0;
        timer = new Timer(new TimerCallback(ParseTimer), null, TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(200));
        key = IpPort;

    }
     
    void ParseTimer(object state)
    {
        var abc = key;    
    }

   
}

我怎样才能摧毁class。

尝试在 Dispose 方法中手动处理计时器。据我所知,计时器从未被处理过。

timer.Dispose();

编辑:还不能发表评论,所以我会编辑答案。据我所知,您不能手动从内存中删除您的实例。

一旦对实例的所有引用都丢失或无法访问,它将通过垃圾收集器收集 - 因此,一旦您像 Trix 在他的回答中建议的那样,从字典中删除实例并处理 Timer 和 SafeHandle,应该没有什么能阻止 GC 收集它。然而,具体何时发生并不取决于您。

EDIT2:我会这么说。您可以尝试通过将一些大文件读取到 String 以占用 100MB 来测试它,并在处理完所有内容后观察内存是否被释放。显然,您还可以直接调用 GC:GC.Collect() - 如果您从 class 调用它,我认为它不会收集 class 但为了测试您从字典中处理后可以调用它。