处置 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 但为了测试您从字典中处理后可以调用它。
在我的项目中有一个名为 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 但为了测试您从字典中处理后可以调用它。