gpt4 book ai didi

c# - 用 using(...) { } 语句包装 Application.Run(new Form()) 是否安全?

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:33 25 4
gpt4 key购买 nike

我正在使用外部 API 连接到 FireWire 相机。该 API 可能是用 C++ 编写的,但值得庆幸的是它带有自己的 .NET 包装器 DLL。 API 需要以下过程:

ApiResource.Init();
// ... use the ressource here ...
ApiResource.CloseAll();
ApiResource.Release();

因为我需要一些特定的处理代码,所以我决定为此编写一个包装类。由于事件处理程序等原因,我需要在我的表单打开时保持资源打开。所以我想使包装器更易于使用,我将其设为实现 IDisposable 的单例,以便我可以包装它在 using 语句中。我想要 Singleton 的原因是有一种受控和有限的方式来调用所需的 API 函数:

class Wrapper : IDisposable {
private Wrapper _instance;
public Wrapper Instance
{
get
{
if(_instance == null)
_instance = new Wrapper();
return _instance;
}
}

private Wrapper ()
{
ApiResource.Init();
_disposed = false;
}

// Finalizer is here just in case someone
// forgets to call Dispose()
~Wrapper() {
Dispose(false);
}

private bool _disposed;

public void Dispose()
{
Dispose(true);

GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
if(!_disposed)
{
if(disposing)
{
}
ApiResource.CloseAll();
ApiResource.Release();
_instance = null;
log("Wrapper disposed.");
_disposed = true;
}
}
}

我想使用它的方式是这样的:

using(Wrapper.Instance) {
Application.Run(new Form());
}

我是 C# 的新手,所以我不确定有几件事:

  1. 在上面的 using(Singleton.Instance) { ... } 中是否总是调用 Dispose()?我的日志记录显示"is",但我不确定...
  2. using 语句包装 Application.Run(...) 是否安全?

最佳答案

你的两个问题的答案都是:

  • Dispose() 将始终在 using block 结束时调用,除非 Wrapper.Instancenull block 开始的时间。

  • 将对 Run() 的调用包装在 using block 中是绝对安全的。

关于c# - 用 using(...) { } 语句包装 Application.Run(new Form()) 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6732189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com